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

时间:2013-08-12 04:48:27

标签: ios objective-c-blocks modalviewcontroller presentmodalviewcontroller

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

我在调用[(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

3 个答案:

答案 0 :(得分:11)

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

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

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

答案 1 :(得分:2)

如果您使用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:方法。您可以在这些方法中执行任何需要清理的操作(例如,从foo调用unwindSegue:方法)。

答案 2 :(得分:0)

你在你的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链接可以更好地理解......!