代码之家  ›  专栏  ›  技术社区  ›  ZN123

swift:viewcontroller的模式,可以从许多地方访问

  •  0
  • ZN123  · 技术社区  · 7 年前

    在我的应用程序中,我有一个“详细信息”屏幕/vc,可以从3个不同的屏幕访问。

    我目前正在使用构造函数依赖注入和3个不同的初始值设定项来根据用户的来源设置正确的变量。

    尽管如此,大多数逻辑都是在相当丑陋的假设下出现的

    写了一个小样本让你了解它现在的样子:

    if object != nil {
    
        WebApi.fetchDropDown1 { items in
            dropdown.selectedItem = items.first{$0.id == object.UnitId}
        }
    
        currentDateLabel = object.date
    } else if object == nil && currentDate == nil {
        // came to add from list of objects
    
        // object doesn't exist yet
    
        WebApi.fetchDropDown1 { items in
            dropdown.selectedItem = items[0] // select first availabile
        }
    
        currentDateLabel = Date() // set today as default date
        deleteButton.isEnabled = false
        // something like that for every element
    
    } else if { currentDate != nil && object == nil} {
        // came here from calendar pick
    
        WebApi.fetchDropDown1 { items in
            dropdown.selectedItem = items[0] // select first availabile
        }
    
        currentDateLabel = currentDate
    
    }
    

    这不是实际的代码,只是为了澄清我要解决的问题。

    许多关于设计模式的教程只是做最简单的用例,我还没有找到一些对更复杂的用例有用的建议。

    谢谢。

    2 回复  |  直到 7 年前
        1
  •  1
  •   hardik parmar    7 年前

    我建议使用 enum 对于这个用例。

    可以在viewcontroller外部声明公共枚举,如下所示:

    public enum InitialiserType {
        case typeOne
        case typeTwo
        case defaultType
    }
    

    在viewcontroller中创建如下属性:

    initialiserType:InitialiserType = .defaultType
    

    如果未指定类型,则将其设置为默认值将使调用默认的初始化器。

    另外,在 viewDidLoad() :

    switch self.initialiserType {
        case .typeOne:
            print("Do the custom code for type one here")
        case .typeTwo:
            print("Do the custom code for type two here")
        case .defaultType:
            print("Do the default code here")
    }
    

    现在初始化viewcontroller时,只需设置以下类型:

    controller.initialiserType = .typeOne
    

    根据您在这里设置的类型,初始化器将相应地工作。

        2
  •  0
  •   Hamed    7 年前

    我认为最好是有一个视图控制器,而不是每个案例,我在我的一个应用程序中遇到了这个问题,起初我用一个视图控制器处理不同的案例,但是当项目变得更大时,应用程序维护非常困难。