5

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

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

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

父视图控制器.h

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

-(void)foo;

@end
4

3 回答 3

11

您需要正确引用您的呈现控制器,如下所示:

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

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

于 2013-08-12T05:41:00.590 回答
2

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

为此,您将在呈现视图控制器中创建一个具有以下签名的方法:

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

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

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

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

于 2013-08-12T05:18:18.787 回答
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链接以获得更好的理解......!

于 2013-08-12T04:54:34.267 回答