UINavigationController pop / push UITableViewController仅适用于动画:NO

时间:2013-03-23 22:46:05

标签: objective-c

我的应用使用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。这不应该影响导航控制器及其控制器。

1 个答案:

答案 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。您可以下载并与您的比较。祝你好运。