2014-01-13 31 views
0

我有這個UISplitViewController,其中主控和詳細VC都是UINavigationController子類。 這兩者應該「同步」工作,即當一個人推新VC時,第二個人也必須推一個VC。當一個人彈出時,另一個人也要彈出。一個總是對另一個觸發相同的行爲。UISplitViewController - 當細節被彈出時彈出主控(反之亦然)

我已經能夠處理問題的推送部分,因爲推送功能在每個我使用的類中都是顯式的。

另一方面,膨化是一個大問題。當用戶按下後退按鈕時會觸發該操作,並且我不知道如何檢測此事件。一種可能的解決方案是檢測事件。

另一種解決方案我認爲是覆蓋UINavigationController- popViewControllerAnimated:,使一類流行的其他類,就像這樣:

// On DetailNav 
- (UIViewController *)popViewControllerAnimated:(BOOL)animated { 
    // Code to make MasterNav pop 

    return [super popViewControllerAnimated:animated]; 
} 

// On MasterNav 
- (UIViewController *)popViewControllerAnimated:(BOOL)animated { 
    // Code to make DetailNav pop 

    return [super popViewControllerAnimated:animated]; 
} 

我沒有刻意添加完整的代碼,因爲這是足以注意到這種方法會導致無限循環,最終會將兩個NavController彈出到它們的根目錄(然後可能會崩潰)。

達到預期行爲的最佳方式是什麼?

回答

0

我發現另一個問題上@Chrizzz's answer的解決方案。

基本上你需要UINavigationController的兩個子類,一個用於master,另一個用於細節。

在這兩個子類中,必須包含UINavigationBarDelegate並將代理設置爲self 。然後,包括下面的方法:

- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item { 
    [[[[self splitViewController] viewControllers][0 or 1] navigationController] performSelector:@selector(popViewControllerAnimated:) withObject:@YES afterDelay:0]; 
    return YES; 
}

在主,你要彈出詳細的VC,這樣就把1上的索引。
詳細說明,您需要彈出主VC,因此在索引中輸入0

此解決方案允許您在彈出視圖控制器之前運行例程。

更新
我得到一些導航欄的錯誤越來越損壞,如nested pop animation can result in corrupted navigation bar。因此,我不是直接調用popViewControllerAnimated:,而是用零延遲調用performSelector:,現在當我彈出我的視圖時,沒有什麼不好的事情發生。

0

對於iOS 5以上,- (BOOL)isMovingFromParentViewController的伎倆:

// Use this in the detail VC 
- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 

    if (self.isMovingFromParentViewController) { 
    // the view is being popped. 
    // so also pop the master VC 
    } 
} 
+0

它不會像以前一樣卡在循環中嗎?因爲如果我從Master彈出,Detail控制器會在你的代碼中輸入'if'語句,對吧? – Guilherme