2017-09-07 1 views
1

J'ai un UIViewController. Il a une vue de conteneur et un UITableViewController est incorporé dedans.Exécuter une fonction dans le contrôleur de vue intégré

enter image description here

La vue tableau présente un tableau de 20 numéros. Taper sur le bouton Delete affiche une feuille d'action qui donne 2 options pour modifier le tableau ci-dessus.

enter image description here

I ont deux fonctions à l'intérieur UITableViewController pour modifier la matrice.

class TableViewController: UITableViewController { 

    fileprivate var values = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    func deleteFirstTen() { 
     values.removeSubrange(values.startIndex..<values.startIndex.advanced(by: 10)) 
     tableView.reloadData() 
    } 

    func deleteLastTen() { 
     values.removeSubrange(values.startIndex.advanced(by: 10)..<values.endIndex) 
     tableView.reloadData() 
    } 

    // MARK: - Table view data source 
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return values.count 
    } 

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) 
     cell.textLabel?.text = "\(values[indexPath.row])" 
     return cell 
    } 
} 

J'initiatialize le contrôleur de vue et appeler les fonctions de la UIViewController mais il ne fait rien.

class ViewController: UIViewController { 

    @IBAction func didTapDeleteButton(_ sender: UIBarButtonItem) { 
     let tableViewController = storyboard?.instantiateViewController(withIdentifier: "TableViewController") as! TableViewController 

     let sheet = UIAlertController(title: nil, message: "Do You Want to Delete...", preferredStyle: .actionSheet) 
     sheet.addAction(UIAlertAction(title: "1 - 10", style: .default) { action in 
      tableViewController.deleteFirstTen() 
     }) 
     sheet.addAction(UIAlertAction(title: "11 - 20", style: .default) { action in 
      tableViewController.deleteLastTen() 
     }) 
     sheet.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil)) 
     present(sheet, animated: true, completion: nil) 
    } 

} 

Comment appeler une fonction dans un contrôleur de vue intégré correctement?

Projet de démonstration chargé here.

+0

est-il vraiment nécessaire le UITableViewController intégré? pourquoi vous ne ajoutez pas simplement le UITableView et son délégué sur votre ViewController? –

+0

@GiuseppeSapienza Ceci est une version simplifiée de mes besoins réels. Dans l'application réelle, je dois afficher une vue de table et une vue de collection dans le même contrôleur de vue. Je dois donc utiliser des vues conteneur. – Isuru

+0

Si vous n'avez pas besoin d'appeler la fonction avec les paramètres, vous pouvez utiliser 'NotificationCenter' et ajouter un observateur à l'intérieur de votre tableviewcontroller, puis dans votre viewcontroller qui intègre cette vue, le controller affiche le nom de ce que vous observez le didTapDeleteButton est appelé. Sinon, si vous avez besoin de paramètres à transmettre, je stockerai une fermeture à l'intérieur de votre viewcontroller qui fait référence à une méthode à l'intérieur du tableviewcontroller et l'appellera cette fermeture si nécessaire. – TNguyen

Répondre

2

Sur la base de votre exemple de projet, ceci est une solution:

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    var tableViewController: TableViewController? = nil 

    // this method is a point in which you can hook onto segues 
    // coming from this viewController and do anything you want to 
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     // if it's a segue going to TableViewController and it has 
     // the identifier we set in the storyboard, then this is the 
     // tableViewController we want to get 
     if segue.identifier == "embedSegue", 
      let vc = segue.destination as? TableViewController { 
      self.tableViewController = vc 
     } 
    } 

    @IBAction func didTapDeleteButton(_ sender: UIBarButtonItem) { 

     let sheet = UIAlertController(title: nil, message: "Do You Want to Delete...", preferredStyle: .actionSheet) 
     sheet.addAction(UIAlertAction(title: "1 - 10", style: .default) { action in 
      self.tableViewController?.deleteFirstTen() 
     }) 
     sheet.addAction(UIAlertAction(title: "11 - 20", style: .default) { action in 
      self.tableViewController?.deleteLastTen() 
     }) 
     sheet.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil)) 
     present(sheet, animated: true, completion: nil) 
    } 

} 

Vous voulez obtenir le tableViewController du Segue créé pour vous dans storyboards. prepareForSegue:sender: La méthode est un point dans lequel vous pouvez vous accrocher à une séquence provenant du viewController donné à une autre (même si elle embarque segue). Vérifiez le code ci-dessus pour la solution de travail. N'oubliez pas de définir un identifiant pour le segue (dans mon cas, j'ai utilisé "embedSegue", mais utilisez tout ce qui a du sens pour vous). Dans votre cas, ce n'est pas nécessaire - vous pouvez simplement tester si le segue passe à TableViewController par exemple, mais c'est une bonne pratique d'utiliser des identifiants de segue - cela vaut la peine quand le projet prend de l'ampleur. Vous pouvez le définir dans le storyboard en cliquant sur le segment (la flèche de ViewController au TableViewController) et sur le panneau de droite dans l'inspecteur d'attributs il y a un champ pour l'identifiant.

+0

Parfait! Je vous remercie. – Isuru