我有一个通过UIModalTransitionStylePartialCurl
转换呈现的模态视图。在那个模态视图中有一个按钮,我想:
但是,当我尝试以下操作时,它只是解除了curl模态视图,但没有显示新视图:
[self dismissModalViewControllerAnimated:YES];
NewView *vc = [[NewView alloc] init];
[self.parentViewController presentModalViewController:vc animated:YES];
我觉得它与最后一行有关。在self
上呈现NewView也不起作用。我怎么能做到这一点?
答案 0 :(得分:3)
您使用的是iOS 5吗?
如果是这样,您看到的问题是由于此处记录的更改:http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instp/UIViewController/parentViewController
该链接的重要一点是:
在iOS 5.0之前,如果视图没有父视图控制器并且以模态方式呈现,则将返回呈现它的视图控制器。这已不再是这种情况。您可以使用presentViewController属性获取呈现视图控制器。
因此,更改为self.presentingViewController可能会解决您的问题,但可能不会。
使用第一个模式的代码:
[self dismissModalViewControllerAnimated:YES];
SecondViewController *sec = [[SecondViewController alloc] initWithNibName:nil bundle:nil];
sec.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self.presentingViewController presentModalViewController:sec animated:YES];
您没有看到新的视图控制器。
在想要使用新的(从iOS5开始)方法后获得你想要的东西:
- (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion
此方法是presentModalViewController的推荐替代品。
在您的第一个视图控制器上使用自定义方法,例如:
- (void)cycleModalViewControllersWithController:(UIViewController *)newViewController
这种方法既可以解除你当前的模态,也可以呈现新模态,如下所示:
- (void)cycleModalViewControllersWithController:(UIViewController *)newViewController {
[self dismissViewControllerAnimated:YES completion:^{
[self presentViewController:newViewController animated:YES completion:NULL];
}];
}
使用完成块启动新模态让你等到旧模态动画完毕。因此,在您的第二个模态视图控制器中,您可以在第一个模态视图控制器上调用自定义方法,并让它管理解除/显示新方法。
答案 1 :(得分:0)
要验证的第一件事是self.parentViewController
是否为零。
NSLog(@"parent == %@", self.parentViewController);
如果它是nil
(在我的测试中它是零)你将需要在该模态视图中传递指向父项的指针。
之后你可以做这样的事情
[self.caller performSelector:@selector(launchNewView:)
withObject:nil
afterDelay:1.0];
[self.caller dismissModalViewControllerAnimated:YES];
这里self.caller
是UIViewController在模态呈现之前设置的“父”。
我认为这不是一个完美的解决方案,但它正在我的测试中工作。