UITextFieldまたはUIDatePickerだけの動的フォーム入力を開発したいと考えています。フォーム入力は型(enum)で初期化する必要があるため、初期化された型に応じてStringまたはDateを返します。たぶん後で私は他のものを返すより具体的な型を追加したいでしょう。動的戻り型のフォーム入力
Swift 4でこれを行うのがベストプラクティスで、どこのデータ(ファーストネーム、ラストネーム、生年月日など)をどこに保存しますか?コントローラーで?ジェネリック型は可能な解決策ですか?サポートのためのユーザーPalleへ
チェリオ
編集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))
}
}
まあ、計画はいくつかのフォーム入力をビューコントローラに持つことでした。フォーム入力には、ラベルと異なるタイプの1つの入力が含まれます。コントローラーがモデルを保持しているので、フォーム入力からの戻り値を処理します。だから、私はフォームの入力が異なるタイプを返さなければならないと思った。 –
私はそれをインターフェイスビルダーで静的に行います。もちろん、あなたは動的な方法でそれを行うことができます。 – Palle
インタフェースビルダーやストーリーボードを使用していないので、コードからすべてのインターフェースとコンポーネントを実行しています。サンプルのソースコードを編集して追加しました。うまくいけば、私が間違っていることを誰かに教えてくれるでしょう。 –