2

我有几个模态视图一直“正常”工作,现在停止返回父视图控制器并且“代码没有改变”。——经典问题描述。

我调试了模态视图关闭并且父视图控制器为零,这解释了问题,但不是原因。我确实将我的 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];
}
4

2 回答 2

6

引用 [1] 关于该属性的内容parentViewController

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

因此,这解决了为什么这之前确实有效而不再有效的问题。如果为 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

于 2011-11-28T20:52:09.973 回答
1

我已经建立了一个添加presentingViewController到 iOS 4 的类别。

它会在 iOS 5 上自行禁用。

您可以无缝使用它。请参阅后向模态

我希望这对您和我一样有好处;它使您的代码更干净!

于 2012-03-22T06:30:33.817 回答