dismissModalViewControllerAnimated适用于self但不适用于parentViewController

Leo*_*hty 4 ios5

我得到dismissModalViewControllerAnimated在以下设置上正常工作但我很困惑为什么它适用于self(modalViewController)而不是parentViewController.

这是设置:

  1. 我有一个UITableViewController,带有一个调用模态视图的导航按钮:


    - (void)viewDidLoad
    {
        [super viewDidLoad];
        self.title = @"Root";

        _data = [NSArray arrayWithObjects:@"One", @"Two", nil];
        _detailController = [[DetailViewController alloc] init];

        // Uncomment the following line to preserve selection between presentations.
        // self.clearsSelectionOnViewWillAppear = NO;

        // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
        // self.navigationItem.rightBarButtonItem = self.editButtonItem;

        self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(showAbout)];
    }

    - (void)showAbout
    {
        AboutViewController *abv = [[AboutViewController alloc] init];
        abv.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
        [self presentModalViewController:abv animated:YES];
    }

Run Code Online (Sandbox Code Playgroud)

这是模态视图控制器AboutViewController,带有一个工具栏按钮,用于触发关闭模式的关闭操作:



    - (IBAction)dismissAction:(id)sender {
        [self dismissModalViewControllerAnimated:YES];
    }

Run Code Online (Sandbox Code Playgroud)

我的问题是为什么[self dismissModalViewControllerAnimated]工作而不是[self.parentViewController dismissModalViewControllerAnimated] ?? 这是iOS 5中的新功能吗?我以为只有parentViewController才能解除子模态视图?

谢谢!

NJo*_*nes 10

[self dismissModalViewControllerAnimated:YES];已经工作了一段时间.如果你问我,iOS开发中最好的秘密之一.

然而,self.parentViewController不工作对iOS 5来说实际上是新的.它已被'替换' self.presentingViewController.

这会导致尝试与iOS 5兼容的代码产生一个有趣的问题.因为您已经self.parentViewController在iOS 5上找到了返回nil.并且UIViewControllers不响应presentingViewControlleriOS 5之前的版本.

它让我们做这样的事情:

if ([self respondsToSelector:@selector(presentingViewController)]){
    [self.presentingViewController dismissModalViewControllerAnimated:YES];
}
else {
    [self.parentViewController dismissModalViewControllerAnimated:YES];
}
Run Code Online (Sandbox Code Playgroud)


小智 8

而不是使用NJones所说的,我建议坚持

[self dismissModalViewControllerAnimated:YES]
Run Code Online (Sandbox Code Playgroud)

这将适用于所有操作系统的原因在文档本身中说明:

"呈现视图控制器负责解除它所呈现的视图控制器.但是,如果您在呈现的视图控制器本身上调用此方法,它会自动将消息转发给呈现视图控制器. "

注意:虽然在iOS5.0中有关此方法的说明.dismissModalViewControllerAnimated:方法已被弃用.dismissViewControllerAnimated:completion:应该在这里使用.