2011-04-02 40 views
69

我不斷收到以下錯誤:iPhone UINavigation問題 - 嵌套推動畫可以導致損壞的導航欄

2011-04-02 14:55:23.350 AppName[42430:207] nested push animation can result in corrupted navigation bar 
2011-04-02 14:55:23.352 AppName[42430:207] nested push animation can result in corrupted navigation bar 
2011-04-02 14:55:23.729 AppName[42430:207] Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted. 
2011-04-02 14:55:23.729 AppName[42430:207] Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted. 

下面是我在做什麼。從一個視圖控制器,我請當某個按鈕被按下的情況如下:

EventsViewController *viewController = [[EventsViewController alloc] init]; 
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController]; 
navController.navigationBar.tintColor = [UIColor blackColor]; 
[self presentModalViewController:navController animated:YES]; 
[viewController release]; 
[navController release]; 

然後,如果某個按鈕被EventsController推動時,我稱:

SingleEventViewController *viewController = [[SingleEventViewController alloc] initWithEvent:[currentEvents objectAtIndex:indexPath.row]]; 
[self.navigationController pushViewController:viewController animated:YES]; 
[viewController release]; 

然後,如果某個按鈕在SingleEventViewController推,我呼籲:

EventMapView* viewController = [[EventMapView alloc] initWithCoordinates]; 
[[self navigationController] pushViewController:viewController animated:YES]; 
[viewController release]; 

所以啊,很明顯,有嵌套推動畫,但是這不就是去了解它的正確方法?我檢查了Apple的DrillDownSave代碼,這似乎是他們如何做的。我使用init方法而不是viewDidLoad方法是否重要?

回答

10

我已經想通了。顯然,如果您從UITableViewDelegate的-didSelectRowAtIndexPath方法的外部調用-pushViewController,則它不起作用。將呼叫轉入該功能。奇怪的。

+20

這可以解決問題,因爲只有在視圖完成動畫之後才能調用didSelectRowAtIndexPath。如果您只是確保在viewDidAppear:或更高版本中調用您的pushViewController,則iOS不會抱怨嵌套的pushViewController調用。 – 2011-05-30 02:58:09

+0

我真的不明白「顯然,如果您從UITableViewDelegate的-didSelectRowAtIndexPath方法的外部調用-pushViewController,它不起作用。」它在我的項目中起作用。 – 2015-12-30 08:02:22

4

當你說你使用init方法而不是viewDidLoad方法時,你是什麼意思?

如果你推一個新的視圖控制器推舊有壞的機會之前,必須付諸行動,你會得到這種錯誤。因此,將某些代碼放入init並過早執行可能會導致您報告錯誤。

在視圖控制器上運行init的時候,視圖還沒有被加載!

+1

我對他說我用的init在viewDidLoad中或的loadView唯一原因是因爲蘋果的示例應用程序不使用init方法來設置,所以我想也許這可能是它的一部分的意見。另外,即使在我將init方法中的所有代碼註釋掉之後,我仍然會遇到這個問題。爲什麼SingleEventViewController也不會發生這種情況,但是,如果是這樣的話? – joshholat 2011-04-03 03:48:26

+0

你不用init來設置你的用戶界面/視圖項目 - 這不是通常的地方。仔細看看UIViewController文檔。視圖可以從筆尖加載。或者你可以在loadView中以編程方式執行它。或者您可以通過筆尖設置基本視圖,然後以編程方式在viewDidLoad中添加更多項目。但是你不應該在init中做這樣的事情。 – occulus 2011-04-03 19:54:15

+0

我以編程方式進行。所以我應該分配內存並設置loadView中的所有屬性,然後將這些內容添加到init中的視圖中?因爲如果我嘗試去做[self.view addSubview:myTableView];在loadView方法中,它崩潰。 – joshholat 2011-04-07 15:36:09

0

1)也許你可以嘗試傳遞必要的變量作爲屬性推UIViewController,而不是使用init方法與參數之前。無論如何,你很可能需要這些參數超出init方法。

此外,在您的initWithCoordinates:方法,你缺少的參數。可能你的自定義init方法是問題的一部分。

2)僅僅因爲你提到viewDidLoad - 這種方法用於初始化的視圖加載之後。如果您使用代碼創建UIViewController,那麼您應該使用loadView來設置子視圖。

+0

initWithCoordinates方法不帶參數。我計劃添加它們,但之後首先遇到了這個問題,並在繼續前嘗試調試它。但是,爲什麼SingleEventViewController不是這種情況呢?它需要在init必須設置的參數。並且,謝謝,我會嘗試使用loadView。 – joshholat 2011-04-03 03:37:50

11

我有同樣的問題/錯誤消息,因爲你沒有剛纔一直在尋找一個解決方案,結束了在這個線程,但是,對我來說我發現只有一個動畫的解決方案實際上有:是做一個時嵌套推(我把動畫:是隻爲最後一推),希望這可以幫助

歡呼聲。

+0

您的評論讓我解決了這個難題 - 請參閱下面對我接受的答案的評論,它可能會在未來幫助您。 – 2011-05-30 02:59:01

+0

我沒有收到錯誤消息,但第一個視圖的導航欄在從第三個視圖彈出後顯示了中間視圖的導航欄。不從頂部設置流行音樂解決了問題。 – Bill 2011-09-05 22:14:11

+0

謝謝,當你提到它的時候,這很有意義。我用動畫推動了初始控制器:YES然後是動畫:NO-ily推動其餘部分讓用戶到達正確的位置。 – Kalle 2012-03-24 17:58:58

115

調用pushViewControllerviewDidAppear之前是不安全的。

+14

這是正確的答案。 – 2012-07-23 04:21:33

+1

當然這是對問題的解釋 – daniherculano 2013-04-22 07:03:57

+2

如果您在輔助線程上調用pushViewController,也會發生這種情況。 – 2013-05-07 17:24:27

8

我遇到了同樣的問題,這是由於筆尖中的按鈕連接到兩個不同的動作導致的。它試圖加載兩個視圖控制器,從而破壞堆棧。

+3

我也有類似的問題。在我的情況下,我有故事板賽段和節目賽段(performSegueWithIdentifier)的混合。當我意外地同時做了這兩件事情時,我得到了這個錯誤。 – Symmetric 2012-03-18 17:23:12

+2

這也是我的問題。我有靜態表格單元「推」到下一個控制器。我在didSelectRowAtIndexPath中也有一個performSegueWithIdentifier。都被稱爲導致這個消息。 – ekawas 2012-07-11 16:32:22

+0

我的答案几乎就是這個答案中所描述的問題,只有在IB中我以某種方式對同一個按鈕有兩個相同的操作。我確信這是因爲我在IB中使用了複製和粘貼。小心。 – Alyoshak 2013-06-06 15:06:38

1

這已被回答,但我認爲這可能會幫助其他人,因爲我得到了同樣的錯誤,但沒有使用表視圖。我終於弄清楚了這個問題。

我已有一個按鈕,其IBAction爲調用的pushViewController。我通過複製現有按鈕創建了一個新按鈕。新按鈕也有一個調用pushViewController的動作。當輕按新按鈕(觸摸裏面),並推動視圖控制器,我得到了這個錯誤。我刪除了新的按鈕,從頭創建它,將它綁定到現有的插座和操作,並且錯誤消失。

93

意外從Interface Builder的兩次 一旦引發相同SEGUE在代碼中,有一次,但兩者在同一時間...

我居然也得到了同樣的錯誤你休息。只有我的問題是我無意中發射了兩次相同的賽格。一次來自界面構建器,一次來自我的代碼。

我有一個UITableView。當選中一個單元格時,界面構建器中的一個segue會觸發。我的繼承人問題,我有SEGUE設立直接發射了一下電池本身,界面生成器中,然後在我的代碼,我有didSelectRowAtIndexPath方法下,代碼,將大火,同樣賽格瑞......像這樣......

[self performSegueWithIdentifier:@"MySegue" sender:tableView]; 

這意味着,當didSelectRowAtIndexPath被選中時因爲行被調用,它會用上面的代碼行觸發segue。然後,界面構建器也會觸發segue,因爲它直接連接到界面構建器中的單元對象。停止直接觸發segue的界面構建器。你必須從視圖控制器的頂部連接segue,而不是嵌套在單元格本身內部。

所以,如果你有這個問題出於同樣的原因是我的,那就是,您呼叫的同一SEGUE兩次,你可以通過取消鏈接從小區的連接直接到你的SEGUE,並具有SEGUE解決這個問題連接始於IB中表層次結構的頂部,而不是嵌套在單元格內。從你的View Controller連接Segue到segue。如果你已經做到了這一點,那麼當你選擇了segue時,它應該突出顯示它來自的整個視圖,而不僅僅是單元格。

現在蘋果文檔performSegueWithIdentifier下這樣規定:寄件人:參考:

應用程序通常不需要直接觸發塞格斯。相反,您可以在與視圖控制器相關聯的Interface Builder中配置一個對象,例如嵌入其視圖層次結構中的控件,以觸發segue。但是,您可以調用此方法以編程方式觸發segue,可能是爲了響應故事板資源文件中無法指定的某些操作。例如,您可以從用於處理震動或加速度計事件的自定義操作處理程序調用它。

在我的情況,我有一個搜索按鈕爲我的UITableView,以及是否在搜索結果表存在於SEGUE被調用,或正常表視圖存在時,必須確定。所以我需要直接觸發segue。

因此刪除界面生成器的嵌入式控制,只是堅持它的視圖控制器本身上,然後觸發SEGUE在你的代碼!

現在,沒有更多的雙節!並沒有更多的錯誤。

希望幫助,我花了好幾個小時來解決這一個。

+1

我的問題也是由兩次觸發造成的按鈕 – lomec 2013-03-06 07:46:00

+10

您好,先生,是救命的人。 – geekchic 2013-08-13 12:43:46

+1

我有設置一個賽格瑞的'UICellView'在IB,然後我實現的代碼通過'self.storyboard'創建一個新的VC和傳遞我的數據到VC,然後通過'[self.navigationController pushViewController推:VC動畫:YES];'。我的解決方案是刪除IB中的segue。 – 2014-03-02 07:49:36

0

我的解決辦法是

[self performSelector:@selector(moveTo) withObject:nil afterDelay:0.5];

1

遇到同樣的問題。在我的情況下,我錯過了switch語句中的一箇中斷,因此兩個segues同時被觸發。輕鬆解決我的問題。

0

這是因爲我的UIControlEvents

[button addTarget:self action:@selector(callSecondView) forControlEvents:UIControlEventAllTouchEvents]; 

我不得不改變UIControlEventAllTouchEventsUIControlEventTouchUpInside或但是你想你的按鈕,如果你有,因爲一個UIButton電話的問題發生的工作對我來說。

2

恩我有這個問題,並且我是新的iOS開發場景。但在接口構建器中查看我的連接檢查器(使用文件的所有者)之後,我看到由於我複製了一個按鈕,因此它已經爲其分配了以前的按鈕方法以及我創建的新方法。我想這就是我的問題的嵌套方面來自哪裏,因爲它正在執行兩種不同的方法,這兩種方法都將視圖推送到導航控制器上。我知道這已經得到了回答,但我想我會把它放在一起,以防其他人像我一樣犯了一個愚蠢的錯誤。

1

我的問題與鍵盤處於活動狀態有關。

-(void)textFieldDidBeginEditing:(UITextField *)textField{ 

     FilterLocationViewController *destViewController = (FilterLocationViewController *)[self.storyboard instantiateViewControllerWithIdentifier:@"FilterLocationViewController"]; 

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

} 

通過代碼更改爲此:

-(void)textFieldDidBeginEditing:(UITextField *)textField{ 

     [_textFieldLocation resignFirstResponder]; //adding this line 

     FilterLocationViewController *destViewController = (FilterLocationViewController *)[self.storyboard instantiateViewControllerWithIdentifier:@"FilterLocationViewController"]; 

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

} 

(添加行[textField resignFirstResponder];)問題走了

這是我從一個文本框的委託方法推視圖控制器引起。

基本的教訓是,如果鍵盤沒有了,你不應該修改navigationController棧。

0

不知道別人的。我認爲大部分使用StoryBoard的人都面臨着這樣的問題。我正在使用XIB。

在我的情況的問題是,當我用推移動到另一個觀點, 我還使用

[self.navigationController popViewControllerAnimated:YES]; 

在當前視圖的ViewWillDisappear在同一時間。只要刪除它,它工作正常。

由於需求和流量,我使用POP。 的層次爲1 - > 2 - > 3

我是在圖2和想轉移,以查看3.在我遇到這個錯誤的話。

-1

這解決了問題: https://github.com/nexuspod/SafeTransition

如果你推(或彈出)與動畫視圖控制器(動畫:是)它不完全性右走,如果你這樣做的另一個推不好的事情發生或在動畫完成之前彈出。

要重現此錯誤,請嘗試同時推送或彈出兩個視圖控制器。例如:

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    UIViewController *vc = [[UIViewController alloc] init]; 
    [self.navigationController pushViewController:vc animated:YES]; 
} 

您會收到此錯誤:

2014-07-03 11:54:25.051 Demo[2840:60b] nested push animation can result in corrupted navigation bar 2014-07-03 11:54:25.406 Demo[2840:60b] Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted.

只需添加代碼文件到您的項目,讓您的導航控制器APBaseNavigationController的子類,你會好做。

+0

鏈接[https://github.com/nexuspod/SafeTransition]不再有效。 – jpros 2015-02-24 02:59:09

1

最近,我遇到了同樣的問題。原因是: - 我試圖錯誤地彈出視圖控制器兩次。您可以通過push和pop視圖控制器設置斷點

0

在我的情況,我無論是從故事板和編程設置推SEGUE檢查這個崩潰。希望這會幫助任何人

0

我有太多這樣的錯誤消息,並且導航欄和導航控制器過渡是怪異。我的設置是嵌入在Tab欄控制器中的一堆導航控制器。問題在於我沒有在我的標籤欄控制器實現viewDidLoad中撥打super.viewDidLoad()

調用超是值得的文檔明確指出,覆蓋viewDidLoad中時,你應該做的,我這學到了艱辛的道路。

也許這可以幫助別人!

0

我知道這是回答,但它可以幫助其他人。

我有同樣的問題,但它是因爲我用了一個信息按鈕壞的事件引起的。 我正在使用「UIControlEventAllTouchEvents」,並生成了兩次將相同視圖推入導航控制器。正確的事件是「UIControlEventTouchUpInside」。我是iOS新手。

-1

剛剛完成了列表,這裏是另一個原因,這可能會導致「嵌套推動畫可以導致損壞的導航欄」:

我做了一個TabBarController內設置多個NavigationController並設置 故事板Identifiy內將selectedIndex屬性。將活動的選項卡移至代碼錯誤消失後。

相關問題