作者:蘑菇宝 | 来源:互联网 | 2024-11-14 16:58
本文介绍了一个在Xcode5.0.2和iOS7模拟器环境下,使用Storyboard创建CoreDataCRUD应用时遇到的导航栏子视图损坏问题及其解决方案。
环境:Xcode 5.0.2 iOS 7模拟器
应用:使用Storyboard创建一个简单的CoreData CRUD应用,包含一个UITableViewController列表和一个UIViewController用于编辑或添加数据。
界面如下图所示,列表显示查询结果和删除功能,选择单元格后跳转到详细页面进行编辑或添加数据。
在TableViewController中,点击+号按钮会Push跳转到DetailViewController;选择单元格也会Push跳转到DetailViewController(identifier为:detailViewByCell)。这些跳转都是通过Storyboard中的连线实现的。
在页面跳转过程中出现了“Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted”的错误,导致导航子视图可能损坏。
为了排查问题,在DetailViewController中输出导航控制器的子视图:
NSLog(@"%@", self.navigationController.viewControllers);
发现DetailViewController出现了两次,显然跳转过程中存在问题。
问题的原因是:在选择UITableViewCell时,通过连线直接PUSH到了DetailViewController,同时在代码中也实现了相同的跳转:
[self performSegueWithIdentifier:@"detailViewByCell" sender:p];
解决方法是移除代码中的跳转逻辑,需要传递参数可以在prepareForSegue方法中处理:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.identifier isEqualToString:@"detailViewByCell"]) {
TRDetailViewController *detailVC = [segue destinationViewController];
Person *p = self.persons[[self.tableView indexPathForSelectedRow].row];
detailVC.editPerson = p;
}
}