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

弯曲的

以编程方式编写 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章