繁体   English   中英

如何从模态视图控制器调用视图控制器上的方法

[英]How to call method on presenting view controller from modal view controller

我有一个模态视图控制器,我从另一个视图控制器调用。 在解除模态视图控制器后,我想在视图控制器上调用一个方法来呈现该模态视图。 最简单的方法是什么?

我尝试在我的模态视图控制器中执行此操作: [(ParentViewController*)self.presentingViewController foo]; 在调用之前[self dismissViewControllerAnimated:YES completion:nil];

Xcode给我一个错误,说foo不被识别,即使它是在控制器中定义和原型化的。 如果您的解决方案涉及块,我真的不理解它们,所以如果您想添加更多细节,我将不胜感激。 谢谢。

ParentViewController.h

@interface ParentViewController : UITableViewController <UITableViewDelegate, UITableViewDataSource>
{
    NewAssignmentViewController *newAssignmentViewController;
    TableViewDataSource *data;
}

-(void)foo;

@end

您需要像这样获得对您的呈现控制器的正确引用:

ParentViewController *presenter = [(UITabBarController *)self.presentingViewController viewControllers][0]; // 0 is assuming that ParentViewController is in the first tab. Change if necessary
[presenter foo];

另一种方法是使用委托,但这是另一个时间的答案。

如果您使用Storyboard segue来呈现视图控制器,则可以使用Unwind Segue将其关闭。 展开segue是一种特殊的segue,它将呈现的视图控制器展开回演示者。

要实现此目的,您将在呈现视图控制器中使用以下签名创建方法:

- (IBAction)unwindAction:(UIStoryboardSegue*)unwindSegue;

这与标准的IBAction不同,因为参数类型是UIStoryboardSegue*而不是普通的id类型(它不必命名为unwindSegue: ,它可以是modalViewFinished:或者你喜欢什么 - 重要的部分是它有返回类型的IBAction和参数类型UIStoryboardSegue* )。

一旦定义了此方法,您可以在故事板中控制 - 从模态视图控制器图标(在其视图下方,图标的小栏中)拖动并释放绿色出口标志上的连接。 这将创建一个展开segue,您应该在属性检查器中给出一个identifier 展开segue不会在storyboard画布中以可视方式显示,因此您必须在画布左侧的项目列表中找到它(默认情况下会折叠,通过单击左下方的小圆形按钮展开它)画布的手角)。

一旦你完成了,而不是调用[self dismissViewControllerAnimated:YES completion:nil] ,只需调用[self performSegue:<Identifier you gave the unwind segue>] 在此过程中,应调用在呈现视图控制器上定义的unwindAction:方法和模态视图控制器上的prepareForSegue:方法。 您可以在这些方法中执行任何需要清理的操作(例如,从unwindSegue:调用foo方法unwindSegue:

你在你的MainView的UIViewController上调用该方法,并将你希望成为ActionSheet的UIViewController传递给它。

UIActionSheet *actionSheetController =[[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"show otherview", nil];
 [self presentModalViewController:actionSheetController animated:YES ];

要关闭UIActionSheet,dimissWithClickedButtonIndex:animated:是您可以实现的UIActionSheet的方法。 任何人都可以调用该方法(因此,如果您想从主视图中删除它,请参考操作表并执行类似的操作

-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
{
        switch (buttonIndex){
            case 0:
            {
               [actionSheet dismissWithClickedButtonIndex:0 animated:YES];
            }
                break;

            case 1:
            {
                MyClass *myclassObject = [[MyClass alloc]init]; 
                [myclassObject foo];
            }
       }
}

只要用户点击“取消”按钮,也会调用该方法。

使用此ModalViewControllers链接可以更好地理解......!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM