我有几个模态视图已经工作“很好”,现在停止返回到父视图控制器并且“代码没有改变”。 - 经典问题描述。
我调试了模态视图解除,父视图控制器是nil,这解释了问题,但不是原因。我确实将我的SDK从4.1.2升级到4.2,所以我可以开始使用iOS 5.我怀疑新的内存管理ARC和我的自动释放风格与保留/释放。
以下是我的rootview控制器到AboutViewController的代码:
- (IBAction)doInfo:(id)sender {
NSLog(@"%s", __FUNCTION__);
AboutViewController *aboutViewController = [[[AboutViewController alloc] initWithNibName:@"AboutViewController" bundle:[NSBundle mainBundle]] autorelease];
if (aboutViewController) {
aboutViewController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
aboutViewController.hidesBottomBarWhenPushed = YES;
self.navigationController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
self.navigationController.navigationBarHidden = YES;
[self presentModalViewController:aboutViewController animated:YES];
}
}
以下是在按下“完成”按钮后将AboutViewController中的消除回到其父节点。
- (IBAction)doDone:(id)sender {
NSLog(@"%s", __FUNCTION__);
[[self parentViewController] dismissModalViewControllerAnimated:YES];
}
好的......我修改如下修改。现在问题是为什么之前有效呢?
- (IBAction)doDone:(id)sender {
NSLog(@"%s", __FUNCTION__);
[self dismissModalViewControllerAnimated:YES];
}
答案 0 :(得分:6)
引自[1]关于财产parentViewController
:
在iOS 5.0之前,如果视图没有父视图控制器并且以模态方式呈现,则将返回呈现它的视图控制器。这已不再是这种情况。您可以使用presentViewController属性获取呈现视图控制器。
因此,这解决了之前为什么会这样做而又不再有效的问题。如果为iOS 5构建,我将使用presentingViewController
属性,因为文档建议让父视图控制器(或在本例中呈现)忽略模态视图。但是,如果为iOS 4和5构建,我会让你的代码到位,因为它会将调用转发到相应的视图控制器。
如果在任何情况下应用程序在重新编译之前在iOS 5上运行得非常完美,我会假设Apple放置了一些运行时技巧,模仿iOS5之前编译的应用程序的旧行为。
答案 1 :(得分:1)
我已经构建了一个在iOS 4上添加presentingViewController
的类别。
它在iOS 5上禁用自身。
您可以无缝使用它。请参阅backward-modal。
我希望这对你有益,就像对我一样。它使你的代码更干净!