2012-01-31 57 views
54

我有一個視圖控制器,它包含一個表視圖,可以選擇表中的項目並且可以正確創建一個詳細視圖控制器。當推送多個詳細視圖控制器時,「DetailViewController開始/結束外觀轉換的不平衡調用」

表中的項目表示可以具有與它們相關聯的基於時間的觸發器的項目,並且爲每個項目安排本地通知(如果當本地通知到期時應用處於前臺,則該項目的詳細視圖會自動顯示。

當兩個通知同時過期而導致視圖不能正確顯示並且另外還有控制檯日誌時,我遇到了一個問題: 「NNN的開始/結束外觀轉換不平衡調用」我的詳細視圖控制器。

表視圖控制器按如下方式創建:

self.tableViewController = [[TableViewController alloc] initWithNibName:@"TableView" bundle:nil]; 
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:self.tableViewController]; 
self.window.rootViewController = navController; 

當本地通知到期和didReceiveLocalNotification:使用NSNotifcationCenter postNotificationName被調用應用程序播放一個通知:和其中表視圖控制器被偵聽。當表視圖控制器接收通知它創建的細節視圖控制器和它推到堆棧爲:

[self.navigationController pushViewController:detailViewController animated:YES]; 

我讀的地方,如果一個視圖控制器推動另一視圖控制器有可能是一個問題,當它本身是不在堆棧的頂部 - 所以我認爲這一定是問題,因爲當表視圖控制器接收到第二個通知時,它將不再位於導航堆棧的頂部,因爲它以前只會推送一個詳細視圖控制器當第一次通知到達時,將其放入堆棧。

所以我改變了推代碼這樣:

[[self.navigationController topViewController].navigationController pushViewController:detailController animated:YES]; 

但它並沒有區別。

所以接下來我想有可能是一個問題,因爲第一個細節視圖控制器沒有得到到第二 視圖控制器之前充分展示的機會被推 - 所以我改變了我的應用程序的通知發佈使用:

[[NSNotificationCenter defaultCenter] postNotificationName: 

[[NSNotificationQueue defaultQueue] enqueueNotification: postingStyle:NSPostWhenIdle] 

這樣的推動不會應用循環的同一iteraction內發生。但是,這並沒有區別,也沒有嘗試引入延遲到詳細視圖controlle的推動:

double delayInSeconds = 0.1; 
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); 
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
    [[self.navigationController topViewController].navigationController  pushViewController:detailController animated:YES]; 
}); 

我不知道去嘗試什麼問題或有什麼未來,任何想法?

+0

陷入了類似的情況,找到了解決:http://stackoverflow.com/questions/19500025/uinavigationcontroller-transition-animations-triggered-too-fast/19738292#19738292 – 2013-11-02 02:23:37

回答

108

「不平衡通話開始/結束的外觀轉變」

當您嘗試與之前的當前視圖控制器完成顯示顯示一個新的視圖控制器發生。您可以通過在viewWillAppear中導航來重現它。

基本上你是試圖推動兩個視點控制器到堆棧在幾乎相同的時間。建議您在tableview控制器中維護一個隊列,該隊列維護需要顯示的詳細視圖列表。推一次一個上到堆棧和來自當前細節視圖是否有任何排隊的這就需要顯示詳細視圖檢查退出。

這種導航將被混淆用戶。考慮讓你的細節視圖支持多個項目可能會更好。

+0

我注意到我用postNofictionName時:那麼viewDidAppear:沒有得到所要求的第一個觀點:第二個正在推前。然而,在改變enqueNotification之後:viewDidAppear在第二個視圖控制器被推入之前(因爲在同一個運行循環調用中發生的推進已經改變爲單獨的循環調用),調用了viewDidAppear。因此,在第二次推送發生之前,這種改變是不是現在已經出現的第一種觀點?但問題依然存在。 – Gruntcakes 2012-02-01 00:27:54

+2

其他有關此錯誤答案的最有幫助的答案之一。請問你從哪裏得到解釋?我希望蘋果文檔在我調試時出現在Google上,但我無法找到任何文檔。 – 2013-04-16 12:14:26

2

它也可以當您嘗試從棧中彈出一個VC不止一次發生。在我的情況下,彈出VC的方法被錯誤地稱爲多次。一旦我清理了這個問題,問題就消失了。

10

發展不平衡調用開始/結束的外觀轉變爲'

說,一個動畫完成的最後一個相關的動畫心不是之前啓動。那麼,在推出新視圖控制器之前,你是否會彈出任何視圖控制器?或者可能會彈出根目錄?如果是的話,請不要動畫。即

[self.navigationController popToRootViewControllerAnimated:NO]; 

然後看看這是否解決了這個問題,在我的情況下,這是做的伎倆。

7

「不平衡通話開始/結束的外觀過渡」當您嘗試與之前的當前視圖控制器完成顯示顯示一個新的視圖控制器會出現誤差。

所以,你必須確保你不會提出一個新的VC直到第一個完成其動畫。

使用didShowViewController和willShowViewController阻止舊完成其動畫之前提出一個新的VC。這是爲backButtonAction製作popViewController的動畫:YES。

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    [self.myNavView.backButton addTarget:self action:@selector(backButtonAction) forControlEvents:UIControlEventTouchUpInside]; 
} 

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    [self.myNavView.backButton removeTarget:self action:@selector(backButtonAction) forControlEvents:UIControlEventTouchUpInside]; 
} 
+1

「所以,你必須確保你在第一次完成動畫之前不會呈現一個新的VC。」 這條線對我來說就像魔術一樣。爲我節省了一天。謝謝!!! – 2014-02-20 18:33:46

+0

很高興我能幫忙! – Gabriel 2015-04-22 13:17:13

0

看看這些重載:

如果它們是空的,然後注意到他們和重建。

- (void) beginAppearanceTransition:(BOOL) isAppearing animated:(BOOL)animated {} 
- (void) becomeActive:(NSNotification *) notification {} 
1

其實你需要等到推動動畫結束。所以你可以委託UINavigationController並阻止推動直到動畫結束。

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated{ 
    waitNavigation = NO; 
} 


-(void)showGScreen:(id)gvc{ 

    if (!waitNavigation) { 
     waitNavigation = YES; 
     [_nav popToRootViewControllerAnimated:NO]; 
     [_nav pushViewController:gvc animated:YES]; 
    } 
} 
-2

您是否使用外觀代理功能?

我發現非常有問題的這個功能,我最後一次有

「不平衡通話開始/結束的外觀轉變爲」

我解決它去掉[[UITextField appearance] ..]方法。

希望這有助於

相關問題