2012-02-14 63 views
3

我轉換一個iPhone應用程序是一個通用的應用程序,它已經大多直截了當地嵌套表格轉換成UISplitViewController安排,但在iPad上運行時,我有一個尚未解決的問題多細節圖這讓我很頭疼。UISplitViewController - 與UINavigationController的

對於普遍的應用程序的兼容性,「主」視圖包含用於通過一系列TableViews的每個顯示一個菜單中進行導航一個UINavigationController。這工作正常。

最終,在用戶到達時顯示在詳細視圖中的內容。每個細節視圖'鏈'都包含在UINavigationController中,因爲某些視圖可以深入顯示地圖等。想法是,彈出按鈕將位於詳細視圖的根級別。注意到每次選擇該行時從頭開始創建詳細視圖可能很重要。

我研究了Apple的多個細節視圖Sample Code,因此使用主視圖作爲UISplitViewController委託,它提供了隱藏/顯示彈出式選擇器,然後將調用向下傳遞給選擇任何替代細節視圖。

在橫向模式下工作時,我可以在主視圖中選擇不同行和詳細信息視圖切換很好 - 一切都很正常。太棒了。

在縱向模式下,東西不能很好地工作......當旋轉到縱向時,彈出按鈕在當前選定的詳細視圖中正確顯示,但當選擇一行時消失(即它不會被添加正確地對新選擇的視圖的NavBar)。

我已經添加診斷代碼,它看起來像正確的電話(用正確的指針)被做展示新選擇的詳細視圖的酥料餅的按鈕。此外,我可以旋轉橫向,然後再回來,彈出按鈕然後出現,所以我相當滿意彈出UIBarButtonItem正在正確地連接到新的詳細NavBar。

由於在選擇行之前不會創建詳細視圖,因此我想知道這是否是在調用showRootPopoverButtonItem(基於Apple示例代碼)時未實例化的UINavigationBar的情況。這個理論支持這樣的事實,即如果我旋轉到橫向並且在選擇相同的視圖時再次返回(如上所述),則出現彈出按鈕。

我也看到在蘋果的示例代碼的註釋,在didSelectRowAtIndexPath方法,只是切換的詳細視圖之前,請注意使用「後」字的...

// Configure the new view controller's popover button (after the view has been displayed and its toolbar/navigation bar has been created). 

所以,我打過電話了showRootPopoverButton方法再次在viewWillAppear(UINavigationBar應該存在的時間),但不會導致彈出按鈕出現。

我會很感激的任何想法和建議,如何獲得時從主視圖中選擇一個新行以人像模式酥料餅的按鈕,立即出現。謝謝。

感謝您閱讀此文,相關代碼如下。

從主視圖,這裏有UISplitViewControllerDelegate選擇,

- (void)splitViewController:(UISplitViewController*)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem*)barButtonItem forPopoverController:(UIPopoverController*)pc 
{ 

    // Keep references to the popover controller and the popover button, and tell the detail view controller to show the button. 
    barButtonItem.title = @"Root View Controller"; 
    self.popoverController = pc; 
    self.rootPopoverButtonItem = barButtonItem; 
    //UIViewController <SubstitutableDetailViewController> *detailViewController = [self.splitViewController.viewControllers objectAtIndex:1]; 

    //^Apple's example, commented out, my equivalent code to obtain 
    // active detail navigation controller below, 

    UINavigationController *detailNavController = [self.splitViewController.viewControllers objectAtIndex:1]; 
    UIViewController *detailViewController = detailNavController.visibleViewController; 

    [detailViewController showRootPopoverButtonItem:rootPopoverButtonItem]; 
} 


- (void)splitViewController:(UISplitViewController*)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem 
{ 
    // Nil out references to the popover controller and the popover button, and tell the detail view controller to hide the button. 
    UINavigationController *detailNavController = [self.splitViewController.viewControllers objectAtIndex:1]; 
    UIViewController *detailViewController = detailNavController.visibleViewController; 
    [detailViewController invalidateRootPopoverButtonItem:rootPopoverButtonItem]; 
    self.popoverController = nil; 
    self.rootPopoverButtonItem = nil; 
} 

而且,非常像蘋果的例子,下面是當在主表中選擇一個行會發生什麼,

if (rootPopoverButtonItem != nil) 
{ 
    NSLog (@"show popover button"); 
    [newDetailViewController showRootPopoverButtonItem:self.rootPopoverButtonItem]; 
} 

從詳細視圖,

- (void)showRootPopoverButtonItem:(UIBarButtonItem *)barButtonItem 
{ 
    NSLog (@"detailViewController (view: %p, button: %p, nav: %p): showRootPopoverButton", self, barButtonItem, self.navigationItem); 

    barButtonItem.title = self.navigationItem.title; 

    [self.navigationItem setLeftBarButtonItem:barButtonItem animated:NO]; 

    popoverButton = barButtonItem; 
} 


- (void)invalidateRootPopoverButtonItem:(UIBarButtonItem *)barButtonItem 
{  
    NSLog (@"detailViewController (%p): invalidateRootPopoverButton", self); 

    // Called when the view is shown again in the split view, invalidating the button and popover controller. 
    [self.navigationItem setLeftBarButtonItem:nil animated:NO]; 

    popoverButton = nil; 
} 
+1

一切與iOS8上的自適應用戶界面的變化,現在你可以使用在iPhone SPLITVIEW以及 - http://swiftwala.com/multiple-detail-views – 2014-11-11 10:53:18

回答

3

有兩件事,我認爲庫爾d是這裏的問題。你應該包括你的其他代碼。特別是當用戶在主服務器中執行操作時更改詳細視圖控制器的部分。如果你只是實例化detailNavController

  1. visibleViewController可能是零。即使你設置了它的根目錄,也沒有「可見的」視圖控制器,因爲它實際上還沒有顯示。您可能需要使用topViewController

  2. 嘗試我不知道,如果你正在創建的用戶選擇在主的東西,但一個新的detailNavController每次如果你是,你需要將rootPopoverButtonItem傳遞到detailViewController又因當方向改變時,只會自動調用- (void)splitViewController: willHideViewController: withBarButtonItem: forPopoverController:

+0

謝謝!你答案的第一部分讓我走上了正軌。花了太長時間才弄清楚這一點,我感謝你的幫助。 – Snips 2012-02-18 02:15:59

+0

謝謝!我所做的解決這個問題的方法是在我的singleton類中存儲對rootPopoverButtonItem的引用 - 似乎運行良好。 – RyanG 2012-12-13 16:55:36

相關問題