2017-09-29 3 views
4
remplace

Je viens de commencer la construction d'une application et maintenant je suis 2 contrôleurs ajoutais de Split View, dans mon Main.storyboard il ressemble à cette imageSwift 4 Scinder Controller Détail maître

enter image description here

J'ai ajouté le code suivant mon Maître:

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. 
     } 
    } 


} 

Et voici mon détail:

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() 
     } 
    } 


} 

Mon problème est que lorsque j'exécute mon application et que je passe au contrôleur de vue partagé et sélectionne un élément dans le maître, il ne va pas au détail, mais remplace le maître. J'ai un exemple d'application qui est juste le contrôleur Split View et j'ai remarqué dans le fichier App Delegate de l'exemple d'application il y a ce code dans l'application (_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> méthode 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 

et il y a aussi cette méthode:

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 
    } 

mon problème avec ce code est que mon contrôleur est Scinder pas le contrôleur inital et mon problème avec le splitViewControlle r méthode, j'ai 2 contrôleurs de vue divisée, je ne peux que la spécificité 1 d'entre eux. Comment puis-je obtenir ce contrôleur split view sans en faire le contrôleur inital?

Répondre

0

votre classe principale doit implémenter UISplitViewControllerDelegate. donc première chose que vous devez faire:

class ContactsMaster: UITableViewController,UISplitViewControllerDelegate { 

et passer outre cette fonction dans votre maître:

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

puis dans viewDidLoad (classe maître) ajouter morues suivantes:

self.splitViewController!.delegate = self; 

self.splitViewController!.preferredDisplayMode = UISplitViewControllerDisplayMode.AllVisible 

self.extendedLayoutIncludesOpaqueBars = true 

I pense que vous passez de nombreuses étapes pour configurer splitviewcontroller, si vous voulez comprendre tout le chemin, vous pouvez lire l'un des nombreux tutoriels écrits pour cela, comme:

http://nshipster.com/uisplitviewcontroller/

0

vous avez fait par hasard oublier de mettre la classe ContactsDetail pour votre Détail VC dans votre storyboard?