2014-06-09 16 views
7

Just in Swift die ersten Schritte und Probleme, die Delegatmethoden für eine UIPickerViewDelegatmethoden in Swift für UIPickerView

die UIPickerViewDelegate meiner Klasse Bisher habe ich Aufruf wie so hinzugefügt:

class ExampleClass: UIViewController, UIPickerViewDelegate 

Ich habe auch meine UIPickerView erstellt und stellen sie den Delegierten dafür:

@IBOutlet var year: UIPickerView 
year.delegate = self 

Jetzt bin ich nur Probleme mit der folgenden in Swift Code drehen:

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView 

Jede Hilfe würde geschätzt ist

Antwort

0

Der Delegierte nicht verantwortlich, dass die Methode für den Aufruf. Stattdessen wird es von der Datenquelle von UIPickerView aufgerufen. Dies sind die beiden Funktionen aufgerufen durch die UIPickerView Datenquelle, die Sie implementieren müssen:

// returns the number of 'columns' to display. 
func numberOfComponentsInPickerView(pickerView: UIPickerView!) -> Int 

// returns the # of rows in each component.. 
func pickerView(pickerView: UIPickerView!, numberOfRowsInComponent component: Int) -> Int 

Um diese Funktionen zu gewährleisten aufgerufen, sollte Ihre Klasse implementieren auch die Datenquelle Protokoll:

class ExampleClass: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource 

Und Ihre Pickers sollte Datenquelle eingestellt werden:

year.dataSource = self 
11

, die tatsächlich eine Methode im UIPickerViewDataSource Protokoll ist, so dass Sie sicher, dass Sie Ihre Kommissionierer Ansicht des gesetzt machen wollen werden dataSource Eigenschaft auch: year.dataSource = self. Der Swift-native Weg scheint Protokolle in Klassenerweiterungen zu implementieren zu sein, wie folgt aus:

class ExampleClass: UIViewController { 
    // properties and methods, etc. 
} 

extension ExampleClass: UIPickerViewDataSource { 
    // two required methods 

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

    func pickerView(pickerView: UIPickerView!, numberOfRowsInComponent component: Int) -> Int { 
     return 5 
    } 
} 

extension ExampleClass: UIPickerViewDelegate { 
    // several optional methods: 

    // func pickerView(pickerView: UIPickerView!, widthForComponent component: Int) -> CGFloat 

    // func pickerView(pickerView: UIPickerView!, rowHeightForComponent component: Int) -> CGFloat 

    // func pickerView(pickerView: UIPickerView!, titleForRow row: Int, forComponent component: Int) -> String! 

    // func pickerView(pickerView: UIPickerView!, attributedTitleForRow row: Int, forComponent component: Int) -> NSAttributedString! 

    // func pickerView(pickerView: UIPickerView!, viewForRow row: Int, forComponent component: Int, reusingView view: UIView!) -> UIView! 

    // func pickerView(pickerView: UIPickerView!, didSelectRow row: Int, inComponent component: Int) 
} 
+1

eine Erweiterung unter Verwendung ein Protokoll zu implementieren ist schön, weil es das Protokoll an einem Ort im Zusammenhang der gesamten Code kapselt, und wenn Sie ändere deine Meinung darüber in der Zukunft, du weißt genau, was du entfernen kannst :) – Jiaaro

+0

Genau! Und da '# pragma' weg ist und die' // MARK ... 'Methode noch nicht funktioniert, ist das der einzige Weg, Dinge im Moment zu organisieren. ;) –

+0

Nate. Wie würde ich auf diese Weise sicherstellen, dass mein UIPickerView verwendet wird? – user3723426

Verwandte Themen