我有一个从另一个视图控制器调用的模态视图控制器。在取消模态视图控制器后,我希望在呈现该模态视图的视图控制器上调用一个方法。最简单的方法是什么?
在调用[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链接以更好地理解。。。!