我轉換一個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;
}
一切與iOS8上的自適應用戶界面的變化,現在你可以使用在iPhone SPLITVIEW以及 - http://swiftwala.com/multiple-detail-views – 2014-11-11 10:53:18