0

我的应用程序使用 UINavigationController 来显示不同的 UITableViewControllers。但是有一个非常奇怪的行为:将 UITableViewController 推送到导航控制器只有在动画pushViewController:animated:设置为NO时才有效。

[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。这不应影响导航控制器及其控制器。

4

1 回答 1

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];
}

我已经在这里上传了示例项目。您可以下载它并与您的比较。祝你好运。

于 2013-03-23T23:20:42.853 回答