2014-01-23 104 views
3

它看起來像我在navigationController pushViewController方法中發現一個錯誤。重新創建它我把樣本主詳細項目並作了一些修改的-didSelectRow:方法:ios7 navigationController pushViewController動畫bug

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    DetailViewController* view = [self.storyboard instantiateViewControllerWithIdentifier: @"view"]; 
    NSDate *object = _objects[indexPath.row]; 
    [view setDetailItem:object]; 
    [self.detailViewController.navigationController pushViewController:view animated:YES]; 
} 

我也改變了詳細視圖爲「視圖」的故事板ID。這裏是發生了什麼:

當選擇任何大師的行慢(當推動畫已完成),它工作正常: selecting rows slowly

如果選擇任何行,而動畫仍然顯示,詳細信息視圖處於非活動狀態(顯示的最後一行調用了該bug前推法),只有在導航欄上顯示了一個新的觀點的推動畫: selecting rows rapidly

發生這種情況時,你得到的調試器輸出一些警告:

Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted. 

nested push animation can result in corrupted navigation bar 

Unbalanced calls to begin/end appearance transitions for <DetailViewController: 0x8a6e070>. 

這裏是討厭的部分:如果你回去的詳細視圖的導航欄上,然後選擇在碩士tableview中不同的行或後退兩次在細節的應用程序崩潰與

Can't add self as subview 

,但如果你在ios6上運行相同的代碼,沒有任何問題或警告。

目前的解決方案:

調用帶有動畫的方法:NO似乎沒有任何問題的工作,顯然沒有推動畫。

另一種解決方法是在Master中將布爾值設置爲false,以便在調用push方法時將其設置爲true,並將其設置爲來自Detail in Detail的viewDidAppear中的true。這樣你可以在調用push方法時檢查值。缺點:如果你嘗試快速選擇同一行,如果你快速選擇不同的行然後它不會顯示在Detail中,但它會在Master tableview中被選中並突出顯示,那麼tableView可能會出現laggy,你可以保存選中的行索引並更改代碼中的選擇,但會導致閃爍的行高亮。

這兩個解決方案都涉及一些妥協,所以我想找到另一種處理方法。有沒有更好的解決方案?

+0

聽起來像你理解發生了什麼以及任何人。如果你有問題,請明確說明。如果你只是提供這個作爲其他人有用的觀察,你應該以問題形式重寫它,在答案中添加解決方案,並接受答案,以便很明顯,你不需要人們花時間在它上面。另外,如果你還沒有,你應該[向Apple報告錯誤](https://developer.apple.com/bug-reporting/)。 – Caleb

+0

對不起,我打算髮布此尋找其他方法來解決此 – Arnas

回答

5

經過一些測試後,似乎在ios6中,當tableview單元格被選中並且被調用時,tableview將.allowsSelection設置爲NO,直到推送結束。

這可以在ios7通過didSelectRowAtIndexPath:推法後設置.allowsSelectionNO和具有在詳細的視圖的方法didAppear:回調容易地再現其中我們設置的tableview的.allowsSelectionYES在主視圖。

雖然這個工作非常好,但我發現當快速選擇兩個不同的單元格時,會發現有點煩人,第二個單元格會被忽略。

所以我已經設置,如果另一個單元格被選中,而推動畫並沒有結束,我保存對新視圖的引用,並在第一個動畫結束後立即推送它。通過這樣做,tableView在我看來似乎有點反應靈敏。

1

您背後的原因是推動視圖控制器,而另一個沒有完全推動(日誌已經警告你這樣做)。

推動畫應該需要大約0.4秒,所以用戶必須足夠快以在0.4秒內點擊另一行,是的,這是適用的,但不是一個正常的行爲。

你可以做的是編輯動畫時間小於0.4秒(可能是0.1或0.2)使用下面的代碼在你的-didSelectRow:方法:

DetailViewController* view = [self.storyboard instantiateViewControllerWithIdentifier: @"view"]; 
NSDate *object = _objects[indexPath.row]; 
[view setDetailItem:object]; 

[UIView beginAnimations:@"ShowDetails" context: nil]; 
[UIView setAnimationCurve: UIViewAnimationCurveEaseInOut]; 
[UIView setAnimationDuration:0.2]; 
[self.detailViewController.navigationController pushViewController:view animated:NO]; 
[UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.navigationController.view cache:NO]; 
[UIView commitAnimations]; 

希望它能幫助:)

+0

從側面的推動畫在我的應用程序中更有意義,所以我選擇了它而不是這個,但其他應用程序可能更喜歡UIViewAnimations,因爲它更容易只需做到這一點,而不是在動畫開始和結束時進行處理。 – Arnas