我有一种情况,我想从另一个打开一个模态控制器。但是当用户关闭时,他们应该回到两个模态控制器的父控制器。
所以我让父控制器负责这个。当用户单击第一个模态控制器上的按钮时,父级上的方法执行类似于下面的代码。
[self.navigationController dismissModalViewController:YES];
SecondModalViewController *c = [[SecondModalViewController alloc] init];
[self.navigationController presentModalViewController:c animated:YES];
[c release];
唯一发生的事情是第一个视图关闭,但我没有看到第二个视图打开。是否可以关闭模态ViewController并在同一方法中打开第二个?如果是这样,怎么样?
答案 0 :(得分:7)
我认为当你关闭第一个视图控制器时,[self.navigation presentmodal ..]没有自己打开新的视频控制器。
你可以这样做:使用布尔变量来说明下次此控制器是否出现(当您关闭当前正在尝试打开的控制器时),它应该关闭,并在viewDidApper中实现该功能:方法,如:
@interface FirstViewController : UIViewController
{
//...
BOOL close;
}
并在.m文件中
-(void)viewDidAppear:(BOOL)animated{
if(close)
[self dismissModalViewControllerAnimated:NO];
else
[super viewDidAppear:animated];
}
现在,要打开新控制器,请执行以下操作:
-(IBAction)openSecondController:(id)sender{
//..
SecondViewController* controller = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
close = YES;
[self presentModalViewController:controller animated:NO];
}
现在,当您关闭第二个时,第一个也将关闭。在我的应用中没有任何可见的副作用..
不是最干净的方式,但我找不到更好的方法。 欢呼声
答案 1 :(得分:2)
我一直都做同样的事情没有问题,虽然我有animated:NO
...我猜你的问题是因为你有animated:YES
。你到底在寻找什么影响?你想看到一个动画,然后另一个动画?如果是这样,您需要延迟执行presentModalViewController。
否则,您应该能够在不关闭第一个模态视图控制器的情况下呈现第二个模态视图控制器。当你调用dismissModalViewController;它应该解雇两者。
答案 2 :(得分:0)
我发现完全一样的反应。它看起来像标准行为。
我解决它的方法是使用performSelector:withObject:afterDelay:
[self performSelector:@selector(presentController:) withObject:navController afterDelay:0.5f];
唯一的缺点是我必须设置一个presentController函数然后执行presentModalViewController:animated:
我尝试使用NSInvocation但是当我尝试为动画参数传递BOOL时,我一直收到错误的访问错误。
最重要的是它有效,我的客户很高兴。
答案 3 :(得分:0)
您可以使用句柄uiviewcontroller关闭并使用Unwind Segues打开另一个。
https://developer.apple.com/library/content/technotes/tn2298/_index.html