以编程方式编写UI我每次都遇到这个问题。
用户按下按钮,根据数据,我必须选择要打开的窗口,每个窗口都是自定义类(<div class="svg-cont">
<img src="http://imgh.us/google-plus-hvr.svg" alt="" />
</div>
)。
如果我必须在10个选项中做出选择,我会得到这个:
UIView
然后考虑让10像这样,每个选项都是一个不同的类视图来显示。
通常,您使用一行变量来执行此逻辑,但由于类名不是变量,因此您无法执行类似`array [name]&#39;。
的操作。根据某些条件返回某种类( 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 .... ){...}
)的好方法是什么我不必重写所有这些行(例如Picker1,Picker2
)
答案 0 :(得分:3)
假设您的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)
}
基于这些选项,有一些方法可以改进代码:
获得枚举后,可以在不同的组件中移动创建,创建工厂。它将变成类似:
class PickerFactory {
pickerForValue(value: OptionEnum) -> PortsPicker? {
switch(value) {
case OptionPicker1:
return PortsPickerViewOne
case OptionPicker2:
return PortsPickerViewTwo
}
return nil
}
}
您的代码(来自示例基类)变为类似:
if let pickerView = PickerFactory().pickerForValue("option1") {
pickerView.delegate = self
pickerView.setWithPorts(ports: blockData["PORTS"] as! [String], selectedPorts: ["1"])
self.view.addSubview(pickerView)
}
复制/粘贴或输入错误时更清洁,更安全。
如果有不同的方法/属性,工厂也非常有用,在交换机中你可以满足你的需要。