2013-03-23 56 views
0

我的应用使用UINavigationController来显示不同的UITableViewControllers。但是有一个非常奇怪的行为:只有在pushViewController:animated:中的动画设置为NO时,才能将UITableViewController推送到导航控制器。UINavigationController弹出/推送UITableViewController仅适用于动画: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。这不应该影响导航控制器及其控制器。

+0

我认为你是在破坏记忆。使用仪器并检查内存和泄漏。 – 2013-03-23 23:25:43

+0

您不应该将navController的视图添加为self.view的子视图。唯一正确的做法是将navController作为self的子视图控制器添加,并使用自定义容器控制器api。 – rdelmar 2013-03-23 23:40:15

+0

@rdelmar我修复了我的代码并替换了'[self.view addSubView:]'(请参阅我的问题的编辑)。但我仍然有同样的行为。 – mixable 2013-03-24 09:58:23

回答

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

+0

谢谢你的回答。我修复了我的代码并替换了'[self.view addSubview:navController.view];'(请参阅编辑)。但没有成功,仍然是同样的行为。 – mixable 2013-03-24 09:55:40

+0

Thx为测试应用程序。我用你的应用程序,并将其与我的代码行进行比较,但没有任何成功。大部分行也在我的applicationDidFinishLaunchingWithOptions中。在最终减少了我在这个方法中的所有代码后,我发现了下面一行导致错误:'[[UITableView appearance] setBackgroundView:bgView];'。 – mixable 2013-03-24 22:04:16

相关问题