2013-03-23 70 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

相關問題