web-dev-qa-db-fra.com

Le type "myViewController" n'est pas conforme au protocole UIPIckerDataSource dans Swift

Je viens de créer une nouvelle classe dans Swift, elle s'appelle myViewController et c'est une UIViewController. Maintenant, j'essaie d'en faire un UIPickerViewDelegate et DataSource mais j'ai une erreur étrange

import UIKit

class myViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
   ...
}

Type "myViewController" does not conform to protocol UIPIckerDataSource apparaît sur UIPickerViewDataSource. 

Est-ce un bug de Xcode-Beta 3 ??

 Screenshot for compile-time error

39
r4id4

Si vous souhaitez vous conformer à ces protocoles, vous devez implémenter toutes les méthodes requises de UIPickerViewDataSource et UIPickerViewDelegate.

Swift ressemble plus à Java quand il s’agit de protocoles parce que si vous n’implémentez pas toutes les méthodes requises déclarées par un protocole, vous obtiendrez une erreur de compilation au lieu d’une exception d’exécution.

55
salman140

Fix-it dans XCode 8.1 insère une version obsolète de la méthode ci-dessous si vous utilisez Swift 3: 

func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
    return componentNumber
}

En XCode 10.0+ 

func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return componentNumber
}
15
offbyone

Implémentez la méthode requise de UIPickerDataSource comme dans la documentation.

La source de données fournit à la vue sélecteur le nombre de composants, et le nombre de lignes dans chaque composant, pour afficher le sélecteur affiche les données. Les deux méthodes de ce protocole sont obligatoires.

Donc, vous devez implémenter ces méthodes

func numberOfComponentsInPickerView(_ pickerView: UIPickerView!) -> Int {}

   func pickerView(_ pickerView: UIPickerView!,
numberOfRowsInComponent component: Int) -> Int{}
11
codester

Mon problème était que j'avais override devant la fonction d'implémentation, où Swift ne considère pas que les implémentations de méthodes de protocole sont des substitutions ( même ). Le simple fait de supprimer le mot clé override a résolu le problème.

0
amr

Mon problème est le nom de la méthode du protocole est illégal,

@protocol ContactsSelectDelegate <NSObject>

- (void)selectContacts:(NSMutableArray *)contacts Tags:(NSMutableArray *)tags;

@end

Ici, Tags: devrait être tags:.
J'espère que ma réponse est utile.

0
DawnSong