Swift:可在许多地方使用的ViewController模式

时间:2018-10-22 07:14:22

标签: ios swift design-patterns

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

我目前正在使用构造函数依赖项注入和3个不同的初始化程序来根据用户来自何处设置正确的变量。

仍然,大多数逻辑都在ViewDidLoad中,如果使用的是丑陋的条件

写了一些样本让您大致了解现在的样子:

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 个答案:

答案 0 :(得分:1)

我建议在此用例中使用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

根据您在此处设置的类型,初始化程序将相应地工作。

答案 1 :(得分:0)

我认为最好有一个视图控制器,而不是每种情况,我的一个应用中遇到了这个问题,起初我用一个视图控制器处理了不同的情况,但是当项目变大时,应用维护非常硬。