如何将第二个UIPickerView关联至自定义代理以实现独立控制?
其实你当前的思路有点绕啦——UIPickerView只会主动调用UIPickerViewDelegate和UIPickerViewDataSource协议里的方法,你自定义的secondDelegate和secondDelegateDataSource并不会被系统自动触发,所以哪怕你写了这些方法,p2也不会去调用它们。
想要不用if判断分别控制两个Picker,更简洁的方式是给每个Picker创建独立的代理类,各自实现标准的UIPickerView代理协议,这样每个Picker绑定自己的代理,完全不用区分Picker实例。
下面是调整后的完整代码:
首先定义两个代理类,各自负责对应Picker的数据和交互:
import UIKit // 第一个Picker的代理类 class Picker1Delegate: NSObject, UIPickerViewDelegate, UIPickerViewDataSource { private let data = ["1","3","5"] func numberOfComponents(in pickerView: UIPickerView) -> Int { return 1 } func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return data.count } func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { return data[row] } } // 第二个Picker的代理类 class Picker2Delegate: NSObject, UIPickerViewDelegate, UIPickerViewDataSource { private let data = ["2","4","6"] func numberOfComponents(in pickerView: UIPickerView) -> Int { return 1 } func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return data.count } func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { return data[row] } }
然后在ViewController里实例化这两个代理,绑定到对应的Picker上:
class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // 实例化两个代理 let picker1Delegate = Picker1Delegate() let picker2Delegate = Picker2Delegate() // 绑定代理和数据源 p1.delegate = picker1Delegate p1.dataSource = picker1Delegate p2.delegate = picker2Delegate p2.dataSource = picker2Delegate // 注意:要把代理对象存为ViewController的属性,否则会被ARC释放 self.picker1Delegate = picker1Delegate self.picker2Delegate = picker2Delegate } @IBOutlet weak var p1: UIPickerView! @IBOutlet weak var p2: UIPickerView! // 存储代理对象,避免被自动释放 private var picker1Delegate: Picker1Delegate? private var picker2Delegate: Picker2Delegate? }
关键说明:
- 每个代理类只负责自己的Picker逻辑,职责单一,代码更清晰
- 必须把代理对象存为ViewController的属性,否则创建后会被自动释放,Picker会失去代理
- 完全不需要用
if pickerView == p1这类判断,每个Picker的逻辑完全隔离
内容的提问来源于stack exchange,提问作者bruno617
相关产品推荐
相关产品推荐

