2012-02-14 75 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

相关问题