首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >当主视图控制器是UITabBarController时,自适应显示细节片段转换为模式而不是在iPhone上推送

当主视图控制器是UITabBarController时,自适应显示细节片段转换为模式而不是在iPhone上推送
EN

Stack Overflow用户
提问于 2014-10-06 02:26:06
回答 3查看 1.9K关注 0票数 16

在XCode 6中,如果您基于Master-Detail应用程序模板创建一个新项目,您将获得一个通用的故事板,该故事板应该适用于所有设备。

在主视图中选择单元格时,局部视图将通过自适应“显示详细信息”分段进行更新。在纵向的iPhone 4、5、6或6+上,这个段会像预期的那样采取推送的形式。在横向的iPad或iPhone 6+上,它将导致局部视图按预期更新。

现在,如果插入一个UITabBarController作为主视图控制器,并且该主视图控制器具有指向原始主视图控制器的选项卡,则在主视图中选择单元时发生的自适应分段不会按照iPhones上的预期运行。你现在得到的不是推式转换,而是模式转换。我怎么才能修复它呢?这看起来很奇怪,默认情况下不支持这一点。

我发现下面的帖子很有用:iOS8 TabbarController inside a UISplitviewController Master,但当我使用建议的方法时,当我在推送肖像后旋转到横向时,我在iPhone 6Plus上得不到正确的行为。细节视图的内容出现在主视图中,这并不奇怪,因为建议的解决方案就是这样做的。

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-07-13 00:35:53

重新观看WWDC14上的视频我想我找到了一个更好的答案。

  1. 使用自定义的UISplitViewController来执行showDetailViewController操作
  2. 使用traitCollection来确定
    1. 的类水平类是紧凑的,获取调用showViewController

    的navigationController

下面是自定义UISplitViewController的代码:

import UIKit

class CustomSplitViewController: UISplitViewController {

    override func showDetailViewController(vc: UIViewController!, sender: AnyObject!) {

        if (self.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClass.Compact) {
            if let tabBarController = self.viewControllers[0] as? UITabBarController {
                if let navigationController = tabBarController.selectedViewController as? UINavigationController {
                    navigationController.showViewController(vc, sender: sender)
                    return
                }
            }
        }

        super.showDetailViewController(vc, sender: sender)
    }
}

不要忘记在情节提要中设置自定义类。

在iPhone 6,iPhone 6+和iPad Air的模拟器中进行了测试,工作正常。

票数 7
EN

Stack Overflow用户

发布于 2017-09-02 17:25:15

不幸的是,选择的答案对我不起作用。然而,我最终还是设法解决了这个问题:

  1. 子类UISplitViewController并在接口生成器中设置新类。
  2. 使新类符合UISplitViewControllerDelegate

是否需要初始化?(编码器aDecoder: NSCoder) {super.init(编码器: aDecoder) self.delegate = self }

  • 实现这两个方法:

func splitViewController(_ splitViewController: UISplitViewController,collapseSecondary辅助视图控制器: UIViewController,到主视图控制器:UIViewController) -> Bool { return true } func splitViewController(_ splitViewController: UISplitViewController,showDetail vc: UIViewController,collapseSecondary: Any?) splitViewController Bool { if -> splitViewController.isCollapsed {splitViewController.isCollapsed tabBarController = splitViewController.viewControllers.first as?UITabBarController else { return false }防护让selectedNavigationViewController = tabBarController.selectedViewController as?UINavigationController else {返回false } //如果让navController = vc作为,则推送视图控制器var detailViewController = vc?UINavigationController,让topViewController = navController.topViewController { detailViewController = topViewController } selectedNavigationViewController.pushViewController(detailViewController,topViewController: true) return true } return false }

票数 3
EN

Stack Overflow用户

发布于 2019-01-09 20:53:52

文档状态当拆分控制器折叠时,它通过调用主视图控制器上的show来处理showDetail,在本例中是选项卡控制器。您需要将其转发给子导航控制器,如下所示:

  1. 创建选项卡控制器子类。序列图像板中的
  2. 将选项卡控制器设置为使用新的子类。
  3. 将此方法添加到子类中:

- (void)showViewController:(UIViewController *)vc sender:(id)sender{
    [self.viewControllers.firstObject showViewController:vc sender:sender];
}

这会将其转发到第一个选项卡中的nav控制器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26205838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档