如何防止选择器视图重复

How to prevent picker view duplication

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

这是因为每次您尝试获取 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

计算属性就像一个函数。确保此类 属性 的结果始终与其依赖项的当前状态保持同步可能很有用。

func createPicker() -> UIPickerView {
    let customPicker = UIPickerView(frame: CGRect(x: 0, y: 0, width: 400, height: 216))
    customPicker.backgroundColor = .white
    return customPicker
}

在您的情况下,这样计算出的 属性 不依赖于任何东西,并且总是 return 一个新的 UIPickerView 实例,只要您引用 proxyPeoplePicker.

你真正想要实现的是用视图控制器初始化的存储 属性。它只计算一次并保持不变,直到您覆盖它。这是你需要做的,要有 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
    }
}