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