【问题标题】:Delegates and Data Sources not working with UIPickerViewDelegate代表和数据源不使用 UIPickerViewDelegate
【发布时间】:2015-10-10 20:04:09
【问题描述】:

我正在尝试为 UIPickerView 实现单独的数据源和委托,以便我的类可以被更多地封装。我有以下委托,它应该在选择器移动时处理:

class LocationPickerViewDelegate : NSObject, UIPickerViewDelegate {
        let months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]

    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        print(months[row]);
    }
}

以及将数据存储在选择器中的这个数据源:

class LocationPickerViewDataSource  : NSObject, UIPickerViewDataSource {
        let months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]

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

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

}

这是我在视图控制器中实现的选择器视图。我将我的数据源和委托分配为我的新类:

class LocationPickerView: UIPickerView, UIPickerViewDelegate {

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.delegate = LocationPickerViewDelegate()
        self.dataSource = LocationPickerViewDataSource()
    }



}

但是我的数据源和委托从未使用过,并且选择器是空白的,这些方法都没有被调用过。但是,如果您在视图中实现这些并设置数据源并委托给自己,那么整个事情就会起作用。有没有人知道为什么会发生这种情况?我是否设置了错误的变量?

如果有人以前见过这个,并且知道出了什么问题,那就太好了。

谢谢。

【问题讨论】:

    标签: ios objective-c swift delegates protocols


    【解决方案1】:

    这是关于强引用。您需要将委托和数据源存储在一个变量中,因为它们是选择器视图本身的weak 变量。视图控制器就是这样做的。

    只需将数据源和委托变量添加到管理选取器的视图控制器即可。

    查看文档的声明:

    weak var delegate: UIPickerViewDelegate?
    weak var dataSource: UIPickerViewDataSource?
    

    【讨论】:

    • 我有点困惑......我应该在哪里使用 LocationPickerViewDelegate 和 LocationPickerViewDataSource 对象设置这些?
    • 我已经在我的 LocationViewController 中添加了这些,其中有 UIPickerView:@IBOutlet weak var LocationPicker: LocationPickerView!弱 var 委托:UIPickerViewDelegate?弱变量数据源:UIPickerViewDataSource?在 LocationPickerView 中 self.delegate = LocationPickerViewDelegate() self.dataSource = LocationPickerViewDataSource() 但还是不行
    • 当然,您引用的代码不起作用。您必须使用实际的委托填充您的 变量 并将 那些 分配给您的选择器视图,而不是在设置委托时创建新的!如果你看不到你创建了空变量,可能你对这个项目有点过头了。
    猜你喜欢
    • 2014-03-01
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多