2016-03-27 8 views
0

Ich wollte eine separate Datenquellenklasse für UIPickerView wie diese erstellen:Benutzerdefinierte Datenquellenklasse für UIPickerView in Swift

class PickerData : NSObject, UIPickerViewDataSource { 
    // class definition goes here 
    var pickerDataSource = ["White", "Red", "Green", "Blue"]; 


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

    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 
     return pickerDataSource.count; 
    } 

    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! { 
     return pickerDataSource[row] 
    } 

} 

Wenn ich versuche, es zu benutzen, ich Thread 1: EXC_BAD_ACCESS (code=1, address=0x0)

func createPickerView() -> UIView { 
    var picker = UIPickerView(frame:CGRectMake(20, 20, 480, 20)) 
    picker.dataSource = PickerData(); 
    picker.delegate = self; 

    var newView = UIView(); 
    newView.setTranslatesAutoresizingMaskIntoConstraints(false); 
    newView.backgroundColor = UIColor.whiteColor(); 

    newView.addSubview(picker) 
    self.view.addSubview(newView) // <-- ERROR HERE 
    return newView; 
} 

jedoch wenn ich die data~~POS=TRUNC zu Selbst ändern behebt es das Problem:

picker.dataSource = self; 
// and add the functions numberOfComponentsInPickerView etc to the 
// main controller it works 

Aber ich würde nicht gerne self verwenden, weil das den Code auf nur eine UIPickerView auf einer Seite beschränkt. Vielleicht ist das nicht so schlimm, aber es fühlt sich ein bisschen traurig an.

+0

Aha, geht die Datenquelle Variable Referenzzähler auf Null, nachdem die Funktion beendet wird, so muss es eingestellt werden, eine Membervariable des View-Controllers sein oder etwas ähnliches . –

Antwort

0

Ja. Ich denke, Tero hat Recht. Es empfiehlt sich, das Datenquellenobjekt als Variable auf dem View-Controller festzulegen. Siehe unten (Swift 3 zum Zeitpunkt des Schreibens):

import UIKit 

class MyViewController: UIViewController, UIPickerViewDelegate { 

    var pickerDataSource = PickerData() 

    //... 
    // other properties, viewDidLoad, etc. 
    //... 

    func createPickerView() -> UIView { 
     var picker = UIPickerView(frame: CGRect(x: 20, y: 20, width: 480, height: 20)) 
     picker.dataSource = pickerDataSource // Data source now set to member of MyViewController 
     picker.delegate = self 

     var newView = UIView() 
     newView.translatesAutoresizingMaskIntoConstraints = false 
     newView.backgroundColor = UIColor.white 

     newView.addSubview(picker) 
     self.view.addSubview(newView) 
     return newView 
    } 

} 

class PickerData: NSObject, UIPickerViewDataSource { 

    // Data source properties, initializer and methods here... 

} 
Verwandte Themen