如何防止选择器视图重复
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
}
}
我有一个使用以下代码创建 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
}
}