web-dev-qa-db-de.com

Der Typ "myViewController" entspricht nicht dem Protokoll UIPIckerDataSource in Swift

Ich erstelle in Swift eine neue Klasse, die myViewController heißt und eine UIViewController ist. Nun versuche ich es zu einem UIPickerViewDelegate und einer DataSource zu machen, aber Ich habe einen seltsamen Fehler

import UIKit

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

Es sagt Type "myViewController" does not conform to protocol UIPIckerDataSource über die UIPickerViewDataSource. 

Ist es ein Fehler von Xcode-Beta 3 ??

 Screenshot for compile-time error

39
r4id4

Sie müssen alle erforderlichen Methoden von UIPickerViewDataSource und UIPickerViewDelegate implementieren, wenn Sie diese Protokolle einhalten möchten.

Swift ähnelt Java in Bezug auf Protokolle. Wenn Sie nicht alle erforderlichen Methoden implementieren, die von einem Protokoll deklariert werden, erhalten Sie einen Kompilierungszeitfehler anstelle einer Laufzeitausnahme.

55
salman140

Fix-it in XCode 8.1 fügt eine veraltete Version der folgenden Methode ein, wenn Sie Swift 3 verwenden: 

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

In XCode 10.0+ 

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

Implementieren Sie die erforderliche Methode von UIPickerDataSource wie in der Dokumentation.

Die Datenquelle versorgt die Picker-Ansicht mit der Nummer Komponenten und die Anzahl der Zeilen in jeder Komponente zur Anzeige von die Daten der Picker-Ansicht. Beide Methoden in diesem Protokoll sind erforderlich.

Daher müssen Sie diese Methoden implementieren

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

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

Mein Problem war, dass ich override vor der Implementierungsfunktion hatte, wobei Swift Protokollimplementierungsimplementierungen nicht als Überschreibungen ( same ) betrachtet. Durch das Entfernen des Schlüsselworts override wurde das Problem behoben.

0
amr

Mein Problem ist, dass der Methodenname des Protokolls illegal ist.

@protocol ContactsSelectDelegate <NSObject>

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

@end

Hier sollte Tags:tags: sein.
Ich hoffe, meine Antwort ist hilfreich.

0
DawnSong