打开UISplitViewController到主视图而不是详细信息

Tom*_*utz 27 objective-c uisplitviewcontroller ios swift

我有一个带有目标iPhone 6应用程序的拆分视图界面.在第一次启动应用程序时,它将打开详细信息视图; 我希望它能打开Master View.我试过了:

self.splitViewController?.preferredDisplayMode = UISplitViewControllerDisplayMode.PrimaryOverlay
Run Code Online (Sandbox Code Playgroud)

其他地方(Prior StackOverFlow Question)建议但它似乎没有做任何事情,并且在启动时不会打开主视图.我还尝试将以下行添加到AppDelegate:

splitViewController:collapseSecondaryViewController:ontoPrimaryViewController:
Run Code Online (Sandbox Code Playgroud)

但是,尽管返回真或假(另一个先前的堆栈溢出问题),我没有成功.

我确实在Xcode中启动了示例Master-Detail应用程序,并根据splitViewController加载到Master视图:call returns false; 但是,我不确定如何在更复杂的布局中完成这项工作.

Swi*_*ect 65

迅速

UISplitViewController显示主视图上面的纵向细节不是关于显示主视图,而是关于在主视图下方呈现全宽的详细视图.

UISplitViewController在iPhone上的肖像显示详细信息VC而不是master是关于崩溃机制的原理.

本答案涉及:

  • Master→细节 (紧凑宽度)
    • iPhone 4s,5,5s,SE,6,6s,7(任何方向)
    • iPod Touch
    • 任何iPhone Plus(肖像)
  • 并排 (所有其他尺寸)
    • iPad的
    • 任何iPhone Plus(风景)

你必须设置preferredDisplayMode..primaryVisible如果它存在,你会想要的!如果只有1个视图适合使用.allVisibleiOS选择(紧凑宽度) ; 在那个大小,下面的代码将选择.DetailMaster

关键是要改变双方preferredDisplayMode.allVisible 返回truecollapseSecondary:onto.

class PrimarySplitViewController: UISplitViewController,
                                  UISplitViewControllerDelegate {

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

    func splitViewController(
             _ splitViewController: UISplitViewController,
             collapseSecondary secondaryViewController: UIViewController,
             onto primaryViewController: UIViewController) -> Bool {
        // Return true to prevent UIKit from applying its default behavior
        return true 
    }
}
Run Code Online (Sandbox Code Playgroud)


Jar*_*ren 13

iOS 14

我没有收到回调splitViewController(_:collapseSecondary:onto:),而是使用了以下新方法。

func splitViewController(_ svc: UISplitViewController, topColumnForCollapsingToProposedTopColumn proposedTopColumn: UISplitViewController.Column) -> UISplitViewController.Column {
    return .primary
}
Run Code Online (Sandbox Code Playgroud)

  • 这在 iOS 14 上完美运行。谢谢。如果您希望支持早期的 iO​​S 版本,请在函数上方的行添加“@available(iOS 14.0,*)” (2认同)

iOS*_*fee 9

第1步 - 打开MasterViewController

第2步 - 确保表视图具有UISplitViewControllerDelegate协议.例如:

class ListVC: UITableViewController,UISplitViewControllerDelegate {}
Run Code Online (Sandbox Code Playgroud)

第3步 - 在ViewDidLoad中添加它

splitViewController?.delegate = self
Run Code Online (Sandbox Code Playgroud)

步骤4 - 然后重写此方法,说主视图控制器应始终折叠到详细视图控制器上:

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


Niñ*_*ipt 5

首次启动该应用程序时,它将打开到“详细信息视图”。我希望它对主视图开放

假设您只希望在第一次启动时这样做,但并不总是这样;例如,在主视图显示空数据集的情况下;那么解决方案就像主从模板显示的那样:

func splitViewController(splitViewController: UISplitViewController, collapseSecondaryViewController secondaryViewController:UIViewController, ontoPrimaryViewController primaryViewController:UIViewController) -> Bool {
    guard let secondaryAsNavController = secondaryViewController as? UINavigationController else { return false }
    guard let topAsDetailController = secondaryAsNavController.topViewController as? DetailViewController else { return false }
    if topAsDetailController.detailItem == nil {
        // Return true to indicate that we have handled the collapse by doing nothing; the secondary controller will be discarded.
        return true
    }
    return false
}
Run Code Online (Sandbox Code Playgroud)