Swift 4 Split View Controller Detail取代Master

我刚刚开始构建一个应用程序,现在我在我的Main.storyboard中添加了2个Split View控制器,它看起来像这个图像

在此处输入图像描述

我将以下代码添加到我的主人:

import UIKit class ContactsMaster: UITableViewController { var ContactsDetailController: ContactsDetail? = nil var objects = [Any]() override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. navigationItem.leftBarButtonItem = editButtonItem let addButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(insertNewObject(_:))) navigationItem.rightBarButtonItem = addButton if let split = splitViewController { let controllers = split.viewControllers ContactsDetailController = (controllers[controllers.count-1] as! UINavigationController).topViewController as? ContactsDetail } } override func viewWillAppear(_ animated: Bool) { clearsSelectionOnViewWillAppear = splitViewController!.isCollapsed super.viewWillAppear(animated) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } @objc func insertNewObject(_ sender: Any) { objects.insert(NSDate(), at: 0) let indexPath = IndexPath(row: 0, section: 0) tableView.insertRows(at: [indexPath], with: .automatic) } // MARK: - Segues override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "showContactDetail" { if let indexPath = tableView.indexPathForSelectedRow { let object = objects[indexPath.row] as! NSDate let controller = (segue.destination as! UINavigationController).topViewController as! ContactsDetail controller.detailItem = object controller.navigationItem.leftBarButtonItem = splitViewController?.displayModeButtonItem controller.navigationItem.leftItemsSupplementBackButton = true } } } // MARK: - Table View override func numberOfSections(in tableView: UITableView) -> Int { return 1 } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return objects.count } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) let object = objects[indexPath.row] as! NSDate cell.textLabel!.text = object.description return cell } override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { // Return false if you do not want the specified item to be editable. return true } override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { if editingStyle == .delete { objects.remove(at: indexPath.row) tableView.deleteRows(at: [indexPath], with: .fade) } else if editingStyle == .insert { // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view. } } } 

这是我的细节:

 import UIKit class ContactsDetail: UIViewController { @IBOutlet weak var detailDescriptionLabel: UILabel! func configureView() { // Update the user interface for the detail item. if let detail = detailItem { if let label = detailDescriptionLabel { label.text = detail.description } } } override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. configureView() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } var detailItem: NSDate? { didSet { // Update the view. configureView() } } } 

我的问题是,当我运行我的应用程序并转到拆分视图控制器并在主控中选择一个项目时,它不会转到详细信息,而是替换主控。

我有一个示例应用程序,它只是拆分视图控制器,我注意到在示例应用程序的App Delegate文件中,应用程序中有此代码(_ application:UIApplication,didFinishLaunchingWithOptions launchOptions:[UIApplicationLaunchOptionsKey:Any]?) – > Bool方法:

 let splitViewController = window!.rootViewController as! UISplitViewController let navigationController = splitViewController.viewControllers[splitViewController.viewControllers.count-1] as! UINavigationController navigationController.topViewController!.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem splitViewController.delegate = self 

还有这种方法:

 func splitViewController(_ splitViewController: UISplitViewController, collapseSecondary secondaryViewController:UIViewController, onto 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 } 

我的这个代码的问题是我的Split View Controller不是初始控制器和我的splitViewController方法的问题,我有2个拆分视图控制器,我只能特异性1。 如何在不将其作为初始控制器的情况下获得此分割视图控制器?

您的主类必须实现UISplitViewControllerDelegate。 所以你需要做的第一件事:

 class ContactsMaster: UITableViewController,UISplitViewControllerDelegate { 

并在您的主人中覆盖此function:

 func splitViewController(splitViewController: UISplitViewController, collapseSecondaryViewController secondaryViewController: UIViewController, ontoPrimaryViewController primaryViewController: UIViewController) -> Bool { return true } 

然后在viewDidLoad(master类)中添加以下代码:

 self.splitViewController!.delegate = self; self.splitViewController!.preferredDisplayMode = UISplitViewControllerDisplayMode.AllVisible self.extendedLayoutIncludesOpaqueBars = true 

我想你跳过了很多配置splitviewcontroller的步骤,如果你想要了解所有的方法,你可以阅读为它编写的许多教程之一,例如:

http://nshipster.com/uisplitviewcontroller/

您是否偶然忘记在故事板中为Detail VC设置ContactsDetail类?