在我的应用中,我有一个“详细信息”屏幕/ 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
}
这不是实际的代码,只是为了阐明我要解决的问题。
许多有关设计模式的教程都只用了最简单的用例,而对于更复杂的用例,我还没有找到有用的建议。
谢谢。
答案 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)
我认为最好有一个视图控制器,而不是每种情况,我的一个应用中遇到了这个问题,起初我用一个视图控制器处理了不同的情况,但是当项目变大时,应用维护非常硬。