有效地在多个类之间进行选择

时间:2017-04-10 08:47:38

标签: ios swift

以编程方式编写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

1 个答案:

答案 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) 
}

复制/粘贴或输入错误时更清洁,更安全。

如果有不同的方法/属性,工厂也非常有用,在交换机中你可以满足你的需要。

相关问题