如何防止选择器视图重复

时间:2018-11-12 13:26:34

标签: ios swift uipickerview

我有一个扩展程序,可以使用以下代码创建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个选择器视图,为了防止重复,我尝试在上面的存储属性下使用,但是它不起作用,当我尝试在内部获取信息时,它总是向我返回其初始值。可能是什么原因造成的?如何使用这些选择器视图防止代码重复?

2 个答案:

答案 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实例,则必须将其解包

more about unwrapping here