带动态返回类型的表单输入
问题描述:
我想开发一个动态表单输入,它可能只是一个UITextField或UIDatePicker。表单输入应该使用类型(枚举)进行初始化,因此根据初始化的类型返回String或Date。也许以后我会想添加更多具体的类型返回其他的东西。带动态返回类型的表单输入
什么是最好的做法与Swift 4做到这一点,你会在哪里存储数据(如名字,姓氏,出生日期)?在控制器中?泛型类型是否可能的解决方案?
Cheerio
编辑10月18日
感谢用户帕勒支持!最终的解决方案将某种看起来是这样:
FormItem.swift
// enum with types for inputs
enum FormItemType: Int {
case text = 0
case date = 1
}
// enum with types of values
enum FormInputValue {
case text(String)
case date(Date)
}
// FormItem holds value, label and input
class FormItem: UIView {
var value: FormInputValue?
var label: FormLabel?
var input: FormInput?
}
FormInput.swift
// Protocol to delegate the change to the controller
protocol FormInputDelegate: NSObjectProtocol {
func inputDidChange(value: FormInputValue)
}
// FormInput holds the actual input
class FormInput: UIView {
var formInput: FormInput?
var delegate: FormInputDelegate?
// Init FormInput with type and optional value
convenience init(type: FormItemType, value: FormInputValue?) {
switch type {
case .text(let text)?:
self.initTextInput(label: label, value: text)
break
case .date(let date)?:
self.initDateInput(label: label, value: date)
break
case .none:
break;
}
}
// Init specific String input field
fileprivate func initTextInput (label: String, value: String?) {
formInput = FormTextInput(label: label, value: value)
self.addSubview(formInput!)
}
// Init specific Date input field
fileprivate func initDateInput (label: String, value: Date?) {
formInput = FormDateInput(label: label, value: value)
self.addSubview(formInput!)
}
}
FormTextInput.swift
// Init actual input with label and optional value
convenience init(label: String, value: String?) {
[...]
}
CreateViewController.swift
// Create View Controller where FormInputs
class CreateViewController: UIViewController {
var firstname: String = "Test 123"
// Init view controller and add FormItem
convenience init() {
let fistnameFormItem = FormItem(type: .text, label: NSLocalizedString("Input.Label.Firstname", comment: ""), value: FormInputValue.text(firstname))
}
}
答
我会使用单独的输入,而不是一个动态输入。
如果你真的想要一个通用输入,你可以用枚举与它的价值关联的值:
enum FormInputResult {
case date(Date)
case name(firstName: String, lastName: String)
}
在模型 - 视图 - 控制器体系结构,如名字和生日等数据应该存储在数据模型。控制器应充当模型和视图之间的中介。
那么计划是在视图控制器中有几个表单输入。表单输入包含一个标签和一个不同类型的输入。由于控制者持有该模型,它负责处理来自表单输入的回报。所以我认为表单输入必须返回不同的类型。 –
我会在界面生成器中静态地做这件事。但当然,你可以用动态的方式做到这一点。 – Palle
我没有使用接口构建器或故事板,所以我正在做代码中的所有接口和组件。我添加了一个带有示例源代码的编辑,希望有人能告诉我我错了什么。 –