iPad:呈现模态视图,我的parentViewController现在为零?

时间:2011-11-28 20:03:36

标签: ipad presentmodalviewcontroller parentviewcontroller

我有几个模态视图已经工作“很好”,现在停止返回到父视图控制器并且“代码没有改变”。 - 经典问题描述。

我调试了模态视图解除,父视图控制器是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];
}

2 个答案:

答案 0 :(得分:6)

引自[1]关于财产parentViewController

在iOS 5.0之前,如果视图没有父视图控制器并且以模态方式呈现,则将返回呈现它的视图控制器。这已不再是这种情况。您可以使用presentViewController属性获取呈现视图控制器。

因此,这解决了之前为什么会这样做而又不再有效的问题。如果为iOS 5构建,我将使用presentingViewController属性,因为文档建议让父视图控制器(或在本例中呈现)忽略模态视图。但是,如果为iOS 4和5构建,我会让你的代码到位,因为它会将调用转发到相应的视图控制器。

如果在任何情况下应用程序在重新编译之前在iOS 5上运行得非常完美,我会假设Apple放置了一些运行时技巧,模仿iOS5之前编译的应用程序的旧行为。

[1] http://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/Reference/Reference.html

答案 1 :(得分:1)

我已经构建了一个在iOS 4上添加presentingViewController的类别。

它在iOS 5上禁用自身。

您可以无缝使用它。请参阅backward-modal

我希望这对你有益,就像对我一样。它使你的代码更干净!