我得到了dismissModalViewControllerAnimated以便在以下设置中正常工作,但我很困惑为什么它适用于self(modalViewController)而不是parentViewController。
以下是设置:
- (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才能解除子模态视图?
谢谢!
答案 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
:应该在这里使用。