【问题标题】:Using NSObject for a UIViewDelegate instead of a UIViewController将 NSObject 用于 UIViewDelegate 而不是 UIViewController
【发布时间】:2014-12-01 00:09:28
【问题描述】:

我想将以下类用作我的 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 视图无法响应适当的选择器,但如果我将委托从 NSObject 移动到 UIViewController 并复制/粘贴委托函数,它可以正常工作。

【问题讨论】:

    标签: swift uiviewcontroller uipickerview uipickerviewdelegate


    【解决方案1】:

    dataSourcedelegate 是弱属性,您应该将 timePickerViewDelegate 声明为实例属性以持有对委托的强引用。

    let timePickerViewDelegate = TimePickerViewDelegate()
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        timePickerView.dataSource = timePickerViewDelegate
        timePickerView.delegate = timePickerViewDelegate
    }
    

    【讨论】:

    • 完美运行。谢谢!永远不会从错误中猜到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 2018-07-13
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    相关资源
    最近更新 更多