我转换一个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