Swiftで入力フォームが簡単に作れる「Eureka」の使い方

##概要
iOSアプリを作るときによく使う入力フォームを簡単に実装できるライブラリ「[Eureka](https://github.com/xmartlabs/Eureka#getting-row-values)」の使い方をまとめました。

###Eurekaとは
![eureka.jpg](https://qiita-image-store.s3.amazonaws.com/0/163599/d4e3eb52-4659-4d7c-150b-7844f98e4697.jpeg)
[XMARTLABS](https://xmartlabs.com/)という企業がもともと「[XLForm](https://github.com/xmartlabs/XLForm)」というフォーム作成用ライブラリを提供しており、それをSwiftで作り直したものらしいです。

###どんな感じ？
Eurekaを使えば

こんな感じや、
![EurekaNavigation.gif](https://qiita-image-store.s3.amazonaws.com/0/163599/2655502e-8ca5-d1d3-eda4-27473b43174b.gif)

こんな感じの入力フォームが**簡単に**作れます。
![EurekaRows.gif](https://qiita-image-store.s3.amazonaws.com/0/163599/db3032ff-bc44-c243-c16c-8e589f636e61.gif)

(gif画像は[EurekaのGitHub](https://github.com/xmartlabs/Eureka#getting-row-values)からお借りしました。)

##導入
Cocoapodsを使用し、Podfileに

```
pod 'Eureka'
```
と記述、`pod install`するだけです。

(Carthageでも可能です。)

##画面の作成
###ViewController作成
`FormViewController`のサブクラスを作成します。

```.swift
class MyFormViewController: FormViewController {

    //...

}
```

###SectionとRowの追加
以下のようにすることでSectionとRowを追加できます。
Rowのタグは[値の取得](#値の取得)で使用します。

```.swift
override func viewDidLoad() {
    super.viewDidLoad()
    form +++ Section("セクション名")
        <<< TextRow("Rowのタグ"){ row in
            row.title = "Rowのタイトル"
            row.placeholder = "プレースホルダー"
        }
        <<< PhoneRow("Rowのタグ"){
            $0.title = "Rowのタイトル"
            $0.placeholder = "プレースホルダー"
        }
    +++ Section("セクション名")
        <<< DateRow("Rowのタグ"){
            $0.title = "Rowのタイトル"
            $0.value = Date(timeIntervalSinceReferenceDate: 0)
        }
}
```

appendメソッドを使うことでもSectionとRowの追加が可能です。

```.swift
override func viewDidLoad() {
    //...
 
    let row = NameRow("Rowのタグ") { 
        $0.title = "タイトル"
    }
    let section = Section()
    section.append(row)
    form.append(section)
}
```

Rowの一覧は[こちら](https://github.com/xmartlabs/Eureka#row-catalog)。

###Section HeaderとFooterのタイトル設定
セクションヘッダだけでなく、フッタのタイトル設定も行えます

```.swift
// ヘッダのタイトルのみ
Section("Title")
 
// ヘッダとフッタのタイトル
Section(header: "Title", footer: "Footer Title")
 
// フッタのタイトルのみ
Section(footer: "Footer Title")
```

##値の取得
値の取得には[SectionとRowの追加](#sectionとrowの追加)で設定したRowのタグを用います。

###rowBy(tag:)
`rowBy(tag:)`メソッドを用いて値を取得します。

```.swift
let textRow = form.rowBy(tag: "Rowのタグ") as! TextRow
let text = textRow.value!
```

###values()
`values()`メソッドを用いれば、タグが設定されている全てのRowの値が取得できます。

```.swift
// タグ設定済みの全てのRowの値を取得
let values = form.values()
 
// Rowの値を取得する
let text = values["Rowのタグ"] as! String
```

##コールバック関数
コールバック一覧は[こちら](https://github.com/xmartlabs/Eureka#callbacks-list)です。

例えばフォームの内容が変更されたときに`print`を行うコードは以下のようになります

```.swift
form
    +++ Section()
    <<< TextRow() {
        // ...
    }.onChange {
        print("Text changed:", $0.value ?? "");
    }
```

##バリデーション
Eurekaでは入力値のバリデーションを行うこともできます。(詳細は[こちら](https://github.com/xmartlabs/Eureka#validations))

例えばRowの値が空の時になにかしらの処理を行う場合、

```.swift
form
    +++ Section()
    <<< TextRow("Rowのタグ") {
        //...
 
        $0.add(rule: RuleRequired())
        $0.validationOptions = .validatesOnChange
    }.cellUpdate { cell, row in
        if !row.isValid {
            // 何らかの処理
        }
    }
```

というようになります。