我有一个扩展程序,可以使用以下代码创建UIPickerView
extension FirstVC {
func createPicker() -> UIPickerView {
let customPicker = UIPickerView(frame: CGRect(x: 0, y: 0, width: 400, height: 216))
customPicker.backgroundColor = .white
return customPicker
}
}
我有一个存储的属性,该属性通过视图控制器中的闭包进行初始化
private var proxyPeoplePicker: UIPickerView {
return createPicker()
}
我还有5个选择器视图,为了防止重复,我尝试在上面的存储属性下使用,但是它不起作用,当我尝试在内部获取信息时,它总是向我返回其初始值。可能是什么原因造成的?如何使用这些选择器视图防止代码重复?
答案 0 :(得分:1)
计算属性的作用类似于一个函数。确保此类属性的结果始终与依赖项的当前状态保持最新可能很有用。
func createPicker() -> UIPickerView {
let customPicker = UIPickerView(frame: CGRect(x: 0, y: 0, width: 400, height: 216))
customPicker.backgroundColor = .white
return customPicker
}
在您的情况下,这种计算所得的属性不依赖任何内容,只要您引用proxyPeoplePicker
,就始终返回UIPickerView的新实例。
您真正想要实现的是使用视图控制器初始化的存储属性。它仅计算一次,并且在您覆盖之前保持不变。这是您需要做的,要有5个pickerView实例可用于操作:
class FirstVC : UIViewController {
private var pickerView1: UIPickerView?
private var pickerView2: UIPickerView?
private var pickerView3: UIPickerView?
private var pickerView4: UIPickerView?
private var pickerView5: UIPickerView?
override func viewDidLoad() {
pickerView1 = createPicker()
pickerView2 = createPicker()
pickerView3 = createPicker()
pickerView4 = createPicker()
pickerView5 = createPicker()
// now you can operate with your picker view
pickerView1?.backgroundColor = .black
}
}
答案 1 :(得分:0)
这是因为每次尝试获取proxyPeoplePicker时,都会创建选择器视图的新实例并将其设置为proxyPeoplePicker。这意味着您没有获得有关先前选择器视图的任何信息,因为已将其替换。
是的,在这种情况下,您应该使用存储的属性,但是 您的财产称为计算财产more about properties here。
因此,在ViewController中的某个位置声明选择器视图
private var proxyPeoplePicker: UIPickerView?
private var proxyPeoplePicker2: UIPickerView?
...
现在在viewDidLoad()中设置选择器视图
proxyPeoplePicker = createPicker()
proxyPeoplePicker2 = createPicker()
...
但不要忘记!如果要获取此proxyPeoplePicker实例,则必须将其解包