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



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

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

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将其取消。展开分段是一种特殊的分段,它将显示的视图控制器展开回演示者。

为了实现这一点,您需要在呈现视图控制器中创建一个具有以下签名的方法:

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

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

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

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

您在作为MainView的UIViewController上调用方法,并将它传递给您想要成为ActionSheet的UIViewControl。

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链接以更好地理解。。。!

最新更新