2017-10-13 13 views
0

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)) 
    } 
} 

答えて

0

私は1つの動的入力の代わりに別々の入力を使用します。あなたは本当に一般的な入力をしたい場合は

は、あなたがその値が関連する値を列挙型を使用することができます:Model-View-Controllerアーキテクチャで

enum FormInputResult { 
    case date(Date) 
    case name(firstName: String, lastName: String) 
} 

、名前や誕生日などのデータは、データに格納する必要がありますモデル。コントローラは、モデルとビューの間のメディエータとして機能する必要があります。

+0

まあ、計画はいくつかのフォーム入力をビューコントローラに持つことでした。フォーム入力には、ラベルと異なるタイプの1つの入力が含まれます。コントローラーがモデルを保持しているので、フォーム入力からの戻り値を処理します。だから、私はフォームの入力が異なるタイプを返さなければならないと思った。 –

+0

私はそれをインターフェイスビルダーで静的に行います。もちろん、あなたは動的な方法でそれを行うことができます。 – Palle

+0

インタフェースビルダーやストーリーボードを使用していないので、コードからすべてのインターフェースとコンポーネントを実行しています。サンプルのソースコードを編集して追加しました。うまくいけば、私が間違っていることを誰かに教えてくれるでしょう。 –

関連する問題