我有三个UIViewControllers:MainViewController,CurledViewController和SecondayViewController。
在MainViewController上我在MainViewController中有一个UIButton,它通过以下方式显示CurledViewController:
curled = [[CurledViewController alloc] init];
[curled setModalTransitionStyle:UIModalTransitionStylePartialCurl];
[self presentModalViewController:curled animated:YES];
从文档中我被告知:
使用此转换呈现的模态视图本身可以防止 提出任何其他模态视图。
这阻止我以这种方式显示CurledViewController时打开SecondaryViewController。我想做的是,在CurledViewController中选择UIButton时,关闭curl并打开SecondaryViewController(无论是来自CurledViewController的调用还是MainViewController无关紧要)。关闭SecondaryViewController后,我希望重新打开CurledViewController。
在CurledViewController中附加到UIButton的函数中,我尝试了这个:
- (void)showSecondary:(UIButton *)sender {
[self.parentViewController dismissModalViewControllerAnimated:YES];
SecondaryViewController *secondaryView = [[SecondaryViewController alloc] initWithNibName:@"Secondary" bundle:Nil];
[self presentModalViewController:secondaryView animated:YES];
...
}
但仍然被告知,
Application tried to present a nested modal view controller while curled
如何以这种方式打开新的UIViewController?
谢谢!
答案 0 :(得分:1)
这里的问题是用于呈现SecondaryViewController的代码仍在从CurledViewController执行。尝试的另一种方法是创建CurledViewControllerDelegate协议。使MainViewController成为CurledViewController的委托,并从showSecondary调用您的委托方法。
在CurledViewController中,您的方法可能如下所示:
- (void)showSecondary:(UIButton *)sender {
[self.delegate dismissCurledViewController:self];
}
在MainViewController中,您的委托方法可能如下所示:
- (void)dismissCurledViewController:(CurledViewController *)controller {
[self dismissModalViewControllerAnimated:NO];
SecondaryViewController *secondaryView = [[SecondaryViewController alloc] initWithNibName:@"Secondary" bundle:nil];
[self presentModalViewController:secondaryView animated:YES];
…
}
修改强>
为了在新模态视图控制器的解雇和显示上保留动画,您需要引入一个延迟,以便第一个动画完成足够的时间。您可以通过使用适当的延迟值调用performSelector:withObject:afterDelay:
来执行此操作。然而,这是一种容易出错的方法,因为它假定第一个动画将始终具有相同的持续时间。
在另一个问题中,作为Andrew Pouliot suggested,您还可以尝试覆盖MainViewController中的viewDidAppear:
,以便它查找一个标志以确定是否应该显示SecondaryViewController。这仍然会使用我上面提到的委托方法,但MainViewController会有以下不同之处:
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
if(showSecondaryViewController) {
SecondaryViewController *secondaryView = [[SecondaryViewController alloc] initWithNibName:@"Secondary" bundle:nil];
[self presentModalViewController:secondaryView animated:YES];
}
showSecondaryViewController = NO;
}
- (void)dismissCurledViewController:(CurledViewController *)controller {
showSecondaryViewController = YES;
[self dismissModalViewController:YES];
}