iPhone竖屏下UISplitViewController显示详细视图控制器而不是主视图控制器

187
我正在使用 Xcode 6 中的通用故事板,目标是 iOS 7 及以上版本。我已经实现了一个 UISplitViewController,在运行 iOS 8 的 iPhone 上原生支持,并且 Xcode 会自动将其后移至 iOS 7。它的表现非常好,除了当你在运行 iOS 8 的 iPhone 上以纵向方式启动应用程序时,分割视图的详细视图控制器被显示,而我预期首先看到主视图控制器。我认为这是 iOS 8 的一个 bug,因为当你在 iOS 7 上运行应用程序时,它会正确显示主视图控制器。但现在 iOS 8 已经发布了,这个问题仍然存在。我该如何设置才能在分割视图控制器要折叠(只显示一个视图控制器)时,显示主视图控制器而不是详细视图?我是在界面构建器中创建了这个分割视图控制器。分割视图控制器是选项卡栏控制器中的第一个视图控制器。主视图控制器和详细视图控制器都是嵌入在表视图控制器中的导航控制器。
14个回答

2

这个函数在新版本的Swift中被重命名了,所以这段代码适用于Swift 4:

import UIKit

class GlobalSplitViewController: UISplitViewController, UISplitViewControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.delegate = self
    }

    func splitViewController(_ splitViewController: UISplitViewController, collapseSecondary secondaryViewController: UIViewController, onto primaryViewController: UIViewController) -> Bool {
        return true
    }

}

2

这对我在iOS-11和Swift 4上起作用:

//Following code in application didFinishLaunching (inside Application Delegate)
guard let splitViewController = window?.rootViewController as? UISplitViewController,
            let masterNavVC = splitViewController.viewControllers.first as? UINavigationController,
            let masterVC = masterNavVC.topViewController as? MasterViewController
else { fatalError() }
splitViewController.delegate = masterVC

//Following code in MasterViewController class
extension MasterViewController:UISplitViewControllerDelegate {
    func splitViewController(_ splitViewController: UISplitViewController, collapseSecondary secondaryViewController: UIViewController, onto primaryViewController: UIViewController) -> Bool {
        return true
    }
}

0

Xamarin / C# 解决方案

public partial class MainSplitViewController : UISplitViewController
{
    public MainSplitViewController(IntPtr handle) : base(handle)
    {
    }

    public override void ViewDidLoad()
    {
        base.ViewDidLoad();

        Delegate = new MainSplitViewControllerDelegate();
    }
}

public class MainSplitViewControllerDelegate : UISplitViewControllerDelegate
{
    public override bool CollapseSecondViewController(UISplitViewController splitViewController, UIViewController secondaryViewController, UIViewController primaryViewController)
    {
        return true;
    }
}

0

只需将 UISplitViewControllerpreferredDisplayMode 属性设置为 .allVisible 即可。

class MySplitViewController: UISplitViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        self.preferredDisplayMode = .allVisible
    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接