dismissModalViewControllerAnimated适用于self但不适用于parentViewController

时间:2012-01-12 06:28:17

标签: ios5

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

以下是设置:

  1. 我有一个UITableViewController,带有一个调用模态视图的导航按钮:
  2. 
    
        - (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];
        }
    
    

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

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

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

    谢谢!

2 个答案:

答案 0 :(得分:10)

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

self.parentViewController无法正常工作对iOS 5来说是新手。它已被self.presentingViewController“替换”。

这会导致尝试与iOS 5兼容的代码出现一个有趣的问题。由于您在iOS 5上发现self.parentViewController返回nil。UIViewControllers在iOS 5之前不响应presentingViewController

它让我们做这样的事情:

if ([self respondsToSelector:@selector(presentingViewController)]){
    [self.presentingViewController dismissModalViewControllerAnimated:YES];
}
else {
    [self.parentViewController dismissModalViewControllerAnimated:YES];
}

答案 1 :(得分:8)

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

[self dismissModalViewControllerAnimated:YES]

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

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

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