我的应用使用UINavigationController来显示不同的UITableViewControllers。但是有一个非常奇怪的行为:只有当pushViewController:animated:
中的动画设置为否时,才能将UITableViewController推送到导航控制器。
[navController pushViewController:tableController animated:NO]
将动画设置为 YES 只是在显示tableController视图之前冻结应用程序。此时没有异常或错误。最后,应用程序在抛出EXC_??? (11) (code=0, subcode=0x0)
几分钟后崩溃。但这是什么意思呢?
更多信息:
以编程方式加载所有控制器和视图。第一:
UITableViewController *tableController1 = [[UITableViewController alloc] init];
navController = [[UINavigationController alloc] initWithRootViewController:tableController1]
[self.view addSubview:navController.view];
单击按钮后,使用以下方法设置tableController2:
UITableViewController *tableController2 = [[UITableViewController alloc] init];
[navController pushViewController:tableController2 animated:NO];
// -> NO works, YES freezes
为了分析tableController2,我还创建了一个自己的tableViewController。结果是:在单击按钮以加载第二个表视图控制器之后,将调用最多viewWillAppear
的所有方法。未调用viewDidAppear
且未显示视图。
有人知道如何找到解决这个问题的解决方案吗?或者任何想法,我的代码中可能缺少什么?评论一堆代码和调试好几个小时还没有帮助......
修改
如评论中所述,最好替换[self.view addSubview:navController.view];
。所以我更改了我的代码并将导航控制器init移动到 appDelegate 。但是没有成功,仍然是相同的行为。
UITableViewController *tableController1 = [[UITableViewController alloc] init];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:tableController1];
NSArray* controllers = [NSArray arrayWithObjects:navController, ..., nil];
tabBarController.viewControllers = controllers;
tabBarController
只是应用程序的rootViewController。这不应该影响导航控制器及其控制器。
答案 0 :(得分:1)
我认为初始化导航控制器存在问题。
尝试更换:
[self.view addSubview:navController.view];
以下:
self.window.rootViewController = navController;
这当然应该在您的 AppDelegate 。
中完成编辑: 我不确定你的项目有什么问题。我用与你相同的导航逻辑创建了一个新项目。
以下是application:didFinishLaunchingWithOptions:
方法:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
UITableViewController *tvc = [[PSTableViewController alloc] init];
UINavigationController *navCtrl = [[UINavigationController alloc] initWithRootViewController:tvc];
UIViewController *vc = [[UIViewController alloc] init];
UITabBarController *tbc = [[UITabBarController alloc] init];
tbc.viewControllers = @[navCtrl, vc];
self.window.rootViewController = tbc;
[self.window makeKeyAndVisible];
return YES;
}
这是表视图控制器tableView:didSelectRowAtIndexPath:
方法。我只是推送另一个表视图控制器,它可以正常工作。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewController *detailViewController = [[UITableViewController alloc] init];
[self.navigationController pushViewController:detailViewController animated:YES];
}
我上传了示例项目here。您可以下载并与您的比较。祝你好运。