以编程方式编写 UI 我每次都遇到这个问题。
一个用户按下一个按钮,根据数据,我要选择打开哪个窗口,其中每个窗口是一个自定义类(UIView
)。
如果我必须在 10 个选项之间进行选择,我会得到这个:
if ( name == "option1" ) {
let Picker1:PortsPicker1 = PortsPickerView(frame:WindowsRect)
Picker1.delegate=self
Picker1.setWithPorts(ports: blockData["PORTS"] as! [String], selectedPorts: ["1"])
self.view.addSubview(Picker1)
}
if( option 2 .... ){...}
然后考虑有 10 个这样的,其中每个选项都是一个不同的类视图来显示。
通常,您可以在一行中使用变量来执行此逻辑,但是由于类名不是变量,因此您不能执行诸如“array[name]”之类的操作。
Picker1,Picker2
根据某些条件返回一种类()的好方法是什么,这样我就不必重写所有这些行(例如picker1.delegate=self
)
假设您的 Picker 视图具有相同的属性和方法,您有多种解决方案:
基类:您可以创建一个基类,该基类将具有公共属性,并让 Picker 视图对其进行扩展。你的代码会变成这样:
var picker: PortsPicker? = nil
if ( name == "option1" ) {
picker = PortsPickerViewOne(frame:WindowsRect)
else if ( name == "option2" ) {
picker = PortsPickerViewTwo(frame:WindowsRect)
} else {
// Other code for not handled options
}
if let pickerView = picker {
pickerView.delegate = self
pickerView.setWithPorts(ports: blockData["PORTS"] as! [String], selectedPorts: ["1"])
self.view.addSubview(pickerView)
}
协议:这是一种与前一种类似的方法,您可以为您的选择器创建一个基本协议,以便它们都具有您需要的属性/方法:
var picker: PortsPickerProtocol? = nil
if ( name == "option1" ) {
picker = PortsPickerViewOne(frame:WindowsRect)
else if ( name == "option2" ) {
picker = PortsPickerViewTwo(frame:WindowsRect)
} else {
// Other code for not handled options
}
if let pickerView = picker {
pickerView.delegate = self
pickerView.setWithPorts(ports: blockData["PORTS"] as! [String], selectedPorts: ["1"])
self.view.addSubview(pickerView)
}
基于这些选项,有一些方法可以改进代码:
一旦你有了一个枚举,你就可以在不同的组件中移动创建,创建一个工厂。它会变成这样:
类 PickerFactory {
pickerForValue(value: OptionEnum) -> PortsPicker? {
switch(value) {
case OptionPicker1:
return PortsPickerViewOne
case OptionPicker2:
return PortsPickerViewTwo
}
return nil
}
}
您的代码(取自示例Base class)变得类似于:
if let pickerView = PickerFactory().pickerForValue("option1") {
pickerView.delegate = self
pickerView.setWithPorts(ports: blockData["PORTS"] as! [String], selectedPorts: ["1"])
self.view.addSubview(pickerView)
}
更干净,更安全,不会复制/粘贴或打字错误。
工厂在不同方法/属性的情况下也非常有用,在开关中您可以执行您需要的操作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句