2017-10-08 2 views
0

J'essaye de changer ListViewControllernavigationItem.titleView basé sur la ligne sélectionnée dans CollectionViewController. J'essaye de faire ceci using une méthode de délégué mais son ne fonctionne pas. didSelectRowAt est appelé, mais le func changeTitleView n'est jamais appelé. Je ne suis pas sûr de ce qui ne va pas. Lorsque j'utilise le func changeTitleView à l'intérieur de CollectionViewController et l'utilise dans sa propre classe, cela fonctionne, donc je sais que la fonction fonctionne. Je ne suis pas tout à fait sûr comment passer les String données choisies de CollectionVC à ListVC. Je suis très nouveau à la méthode des délégués.Méthode de délégué pour modifier la navigationItem.titleView ne fonctionne pas

variable globale:

var selectedCollection: CollectionItem?

CollectionViewController:

protocol HandleTitleView { 
    func doesThisWork(answer: String) 
} 

class CollectionViewController: UITableViewController { 

    var handleTitleViewDelegate: HandleTitleView? = nil 

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    let selectedItem = collections[indexPath.row] 
    selectedCollection = selectedItem 
    let title = selectedCollection?.collectionTitle 

    handleTitleViewDelegate?.doesThisWork(answer: title!) 
    } 
} 

ListViewController:

class ListViewController: UITableViewController { 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // set up the collectionViewDelegate 
    let collectionViewController = storyboard?.instantiateViewController(withIdentifier: "CollectionViewController") as! CollectionViewController 
    collectionViewController.titleView = titleLabel 
    collectionViewController.handleTitleViewDelegate = self 
} 

extension ListViewController: HandleTitleView { 

    func doesThisWork(answer: String) { 
    print(answer) 

    } 

} 

Je vous remercie de toute aide que vous pouvez me fournir. Merci d'avance.

MISE À JOUR

J'instancié avec la CollectionViewController à travers un menu latéral nommé MenuTableViewController. Je pris conscience maintenant que je dois aux méthodes de délégué de la chaîne, cependant, CollectionViewController est noyé dans une barre de navigation quand j'instancier, je dois instancier CollectionViewControllerNav et je suis incapable de mettre MenuTableViewController en tant que délégué CollectionVC:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 

    switch indexPath.row { 

    case 0: 

      let collectionViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "CollectionViewController") as! CollectionViewController 
      collectionViewController.handleTitleViewDelegate = self 

      let collectionViewControllerNav = storyboard?.instantiateViewController(withIdentifier: "CollectionViewControllerNav") 
      self.present(collectionViewControllerNav!, animated: true, completion: nil) 

I ne suis pas sûr comment définir la méthode déléguée lorsque cela est le cas

MISE à JOUR

la méthode déléguée fonctionne quand je Presen le CollectionViewController mais pas son CollectionViewControllerNav homologue

+0

Vous ne pouvez pas remplacer la méthode dans l'extension. Pour votre problème, vous pouvez utiliser des méthodes de délégués en implémentant la méthode select select dans collectionviewcontroller et les déléguer à Listviewcontroller. Dans le contrôleur de liste, vous vous conformez au délégué et écrivez votre code. –

+0

Merci pour cette information. J'ai mis à jour le code (et ma question) pour refléter ce changement, cependant la fonction de méthode/protocole de délégué n'est toujours pas appelée.Que puis-je faire pour connecter les deux? – zachenn

+0

Pouvez-vous partager une implémentation? donc je peux regarder dedans Merci –

Répondre

0

Les extensions ne peuvent/ne doivent pas remplacer.

Il n'est pas possible de remplacer les fonctionnalités (comme les propriétés ou les méthodes) dans les extensions, comme indiqué dans le guide Swift d'Apple.

Extensions can add new functionality to a type, but they cannot override existing functionality. 
Apple Developer Guide 

Le compilateur vous permet de passer outre à l'extension de la compatibilité avec Objective-C. Mais c'est en fait une violation de la directive linguistique.

Au lieu d'exttennd CollectionViewcontroller pour didSelectrow. vous devez implémenter la méthode didSelectRow est CollectionViewController

+0

Merci pour cette information. J'ai mis à jour le code (et ma question) pour refléter ce changement, cependant la fonction de méthode/protocole de délégué n'est toujours pas appelée. Que puis-je faire pour connecter les deux? – zachenn

+0

protocole HandleTitleView { func doesThisWork (réponse: chaîne) } – iOSPawan

+0

Le protocole a été ajouté. Je mets un point d'arrêt à 'func doesThisWork (answer: String)' mais le point d'arrêt ne frappe jamais. – zachenn