web-dev-qa-db-fra.com

sélecteur non reconnu envoyé à l'instance - Swift 4 uniquement

J'ai du mal à comprendre ce que cette erreur signifie. Mon application fonctionnait bien jusqu'à la migration de Swift 4. Jusqu'à présent, je reçois cette erreur tableView:numberOfRowsInSection lorsque j'essaie d'ouvrir plusieurs de mes contrôleurs de vue. Je n'ai eu aucune de ces erreurs dans Swift 3.2. La méthode numberOfRowsInSection a été implémentée dans tous les cas et semble correcte. Est-ce que quelqu'un peut-il me montrer la bonne direction?

2017-11-26 10: 21: 04.973523-0600 Y2GOsp [27701: 6382461] - [Y2GOsp.ClientDetailViewController tableView: numberOfRowsInSection:]: sélecteur non reconnu envoyé à l'instance 0x7fa51c89f000 2017-11-26 10: 21: 43.328635-0600 Y2GOsp [27701: 6382461] *** Application de terminaison en raison de exception non interceptée 'NSInvalidArgumentException', raison: '- [Y2GOsp.ClientDetailViewController tableView: numberOfRowsInSection:]: sélecteur non reconnu envoyé à instance 0x7fa51c89f000 '

nombre d'implémentations de numberOfRowsInSection:

Exemple 1:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 1
}

Exemple 2:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return dayAppoints.count
}
3
Lastmboy

@Hamish a identifié le problème dans son commentaire. Vous avez oublié d'ajouter UITableViewDataSource à votre déclaration class. Pour cette raison, vos méthodes de source de données n'ont pas été exposées à Objective-C.

Ma suggestion d'essayer d'ajouter @objc aux méthodes a confirmé le problème.

Cela a fonctionné dans Swift 3 parce que toutes les méthodes de classes dérivées de NSObject (que UIViewController fait) étaient disponibles pour Objective-C.

Dans Swift 4 (en raison de SE-0160) , il est nécessaire de baliser explicitement les fonctions avec @objc qui seront appelées via un sélecteur, à moins que vous ne surchargiez une fonction ainsi marquée dans la classe de base, ou dans ce cas si les fonctions satisfont à l'exigence d'une définition de protocole @objc.

12
vacawama

J'ai eu le même problème et j'ai suivi les suggestions de vacawama. Mais au lieu d’ajouter @objc avant chaque méthode déléguée (je trouve les balises @objc très moches), j’ai demandé à ViewController d’implémenter les protocoles UITableViewDataSource et UITableViewDelegate (j'ai un générique VC contenant un UITableView)) et d’attribuer mon ViewController à sa tableVoir explicitement en tant que source de données et délégué:

self.tableView.delegate = self
self.tableView.dataSource = self

et cela fonctionne comme un charme, sans les tags @objc laids . En fait, j’ai assigné à l’origine le délégué et la source de données à la tableView à l’aide du InterfaceBuilder (via ctrl + clic)

0
AleGiovane