Использование NSObject для UIViewDelegate вместо UIViewController

У меня есть следующий класс, который я хочу использовать в качестве своего UIPickerViewDelegate

class TimePickerViewDelegate: NSObject, UIPickerViewDataSource, UIPickerViewDelegate  {

    let pickerData = ["Mozzarella","Gorgonzola","Provolone","Brie","Maytag Blue","Sharp Cheddar","Monterrey Jack","Stilton","Gouda","Goat Cheese", "Asiago"]

    //MARK: - Delegates and data sources
    //MARK: Data Sources
    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
        return 1
    }
    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return pickerData.count
    }

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

    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        println( pickerData[row] )
    }
}

Я инициализирую его в моем основном UIViewController со следующим

 override func viewDidLoad() {
    super.viewDidLoad()

    let timePickerViewDelegate = TimePickerViewDelegate()

    timePickerView.dataSource = timePickerViewDelegate
    timePickerView.delegate = timePickerViewDelegate
}

Однако, когда я запускаю приложение, я получаю следующую ошибку.

2014-11-30 15:49:22.046 HausClock[78601:10273448] -[NSISEngine numberOfComponentsInPickerView:]: unrecognized selector sent to instance 0x7da406e0
2014-11-30 15:49:22.052 HausClock[78601:10273448] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSISEngine numberOfComponentsInPickerView:]: unrecognized selector sent to instance 0x7da406e0'

Кажется, он говорит мне, что мой TimePicker View не может ответить на соответствующий селектор, но если я переместу делегат из NSObject в UIViewController и скопирую / вставлю функции делегата, он будет работать правильно.

1 ответ

Решение

dataSource а также delegate являются слабыми свойствами, вы должны объявить timePickerViewDelegate в качестве свойства экземпляра для строгой ссылки на делегат.

let timePickerViewDelegate = TimePickerViewDelegate()

override func viewDidLoad() {
    super.viewDidLoad()

    timePickerView.dataSource = timePickerViewDelegate
    timePickerView.delegate = timePickerViewDelegate
}
Другие вопросы по тегам