Pet*_*ttl 13 iphone uitabbarcontroller uinavigationcontroller uisplitviewcontroller ios8
我有一个UISplitViewController,它包含一个UITabBarController作为主视图.这个UITabBarController包含一个UINavigationController.详细视图也包含UINavigationController.

在iPad上,这可以按预期工作.的节目详细赛格瑞呈现在详细视图中导航控制器内的ImageView的.
另一方面,在iPhone上,我预计show detail segue会在主视图的导航控制器的堆栈上推送详细视图.但实际上它是在主视图上以模态方式呈现的.
从故事板中删除UITabBarController并直接在主视图中使用UINavigationController时,这可以正常工作.
有谁知道如何在iPhone上的主人UINavigationController堆栈上呈现详细视图?
彼得的解决方案的问题在于它将与iPhone 6 +分道扬.. 怎么会这样?使用该代码,如果iPhone 6 +处于纵向 - 细节视图将推入导航堆栈.到目前为止一切都很顺利.现在,旋转到横向,然后您将显示详细视图作为详细视图和主视图.
您需要拆分视图控制器的委托来实现两种方法:
- (BOOL)splitViewController:(UISplitViewController *)splitViewController showDetailViewController:(UIViewController *)detailVC sender:(id)sender
{
UITabBarController *masterVC = splitViewController.viewControllers[0];
if (splitViewController.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassCompact)
[masterVC.selectedViewController showViewController:detailVC sender:sender];
else
[splitViewController setViewControllers:@[masterVC, detailVC]];
return YES;
}
Run Code Online (Sandbox Code Playgroud)
现在,您需要从选定选项卡的导航控制器返回顶视图控制器:
- (UIViewController*)splitViewController:(UISplitViewController *)splitViewController separateSecondaryViewControllerFromPrimaryViewController:(UIViewController *)primaryViewController
{
UITabBarController *masterVC = splitViewController.viewControllers[0];
if ([(UINavigationController*)masterVC.selectedViewController viewControllers].count > 1)
return [(UINavigationController*)masterVC.selectedViewController popViewControllerAnimated:NO];
else
return nil; // Use the default implementation
}
Run Code Online (Sandbox Code Playgroud)
有了这个解决方案,一切都会推送到导航堆栈,并且还可以在iPad/6 +横向上正确更新详细视图.
我想出了如何将细节放到master的UINavigationController上,而不是通过UITabBarController以模态方式呈现它.
使用UISplitViewControllerDelegate方法
- splitViewController:showDetailViewController:sender:
Run Code Online (Sandbox Code Playgroud)
如果UISplitViewController折叠,请获取主控导航控制器并将详细视图推送到此导航控制器:
- (BOOL)splitViewController:(UISplitViewController *)splitViewController
showDetailViewController:(UIViewController *)vc
sender:(id)sender {
NSLog(@"UISplitViewController collapsed: %d", splitViewController.collapsed);
// TODO: add introspection
if (splitViewController.collapsed) {
UITabBarController *master = (UITabBarController *) splitViewController.viewControllers[0];
UINavigationController *masterNavigationController = (UINavigationController *)master.selectedViewController;
// push detail view on the navigation controller
//[masterNavigationController pushViewController:vc animated:YES];
// push was not always working (see discussion in answer below), use showViewController instead
[masterNavigationController showViewController:vc sender:sender];
return YES;
}
return NO;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2620 次 |
| 最近记录: |