【CocoaPods】挫折しながら学ぶ!素人のiOSアプリ開発 part5【swift】

iOSアプリ開発

どうも、僕です!

今回は、前回に引き続き「パスワードロック」を実装していきます。

現在は、正解パスワードをソースコードにそのまま直書きしてしまっています。それじゃダメなので、今回は「ユーザがパスワードを設定画面から変更できるようにする」を目標にがんばりたいと思います!

今回もライブラリを使用していきましょう!
TableViewで0から作ってもいいんですけど、僕いまだにデリゲートの概念を理解してないんですよ。なのでライブラリに頼ります。

GitHub - xmartlabs/Eureka: Elegant iOS form builder in Swift

ライブラリ名:Eureka

エレガントなフォームを簡単に作ってくれるライブラリです。スター数も多くて期待がもてます。たのしみですね〜。

podにライブラリを追加する際は「pod update」を行う

今回は、すでに使用しているNote4プロジェクトに「Eureka」を追加導入します。

# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'Note4' do
# Comment the next line if you're not using Swift and don't want to use dynamic frameworks
use_frameworks!

# Pods for Note4
pod 'SmileLock' ←前回の
pod 'Eureka' ←今回はここに1行追加した

target 'Note4Tests' do
inherit! :search_paths
# Pods for testing
end

target 'Note4UITests' do
inherit! :search_paths
# Pods for testing
end

end


Podfileを上記のように書き換えた後「pod update」を使います。「pod install」ではありません。注意!

まずはEurekaのサンプルプロジェクトを拝見

ソースコードだけで18.5Mもあって超ボリューミーなんですけど!

早速サンプルプロジェクトを動かしましょう。

一番上の項目「Rows」の中身はこんな感じ。

なんかイロイロありますね。

試しに実装してみる

サンプルプロジェクトのソースを真似て実装してみました。

import UIKit
import Eureka

class SettingController: FormViewController{

override func viewDidLoad() {
super.viewDidLoad()

form +++ Section("Section1")
<<< TextRow(){ row in
row.title = "Text Row"
row.placeholder = "Enter text here"
}
<<< PhoneRow(){
$0.title = "Phone Row"
$0.placeholder = "And numbers here"
}
+++ Section("Section2")
<<< DateRow(){
$0.title = "Date Row"
$0.value = Date(timeIntervalSinceReferenceDate: 0)
}

}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}

}

ぶええええええええええええええ!?!?!?!?!

こんだけのソースでいいの!?
ちなみにストーリーボードは特に何もいじってません。真っ白のViewControllerがあるだけです。
(諸事情によりTabをいれてますが、Eurekaとは特に関係ありません。)

ポイントは、UIViewControllerではなく「FormViewController」を継承すること。それにより「form +++ Section・・・」以下のソースコードが使用可能になります。

僕としては

+++ってなんだよ!演算でもしてんの!?

ということが気になって仕方がなかったんですが、どうやらEurekaで使われている「+++」は「オペレータ」というものらしいです。・・・オペレータって何?

【追記】後日、オペレーターではなく「カスタム演算子」だということが判明。これ↓

public func +++(left: Form, right: Section) -> Form {
left.append(right)
return left
}

public func +=<C : Collection>(inout lhs: Form, rhs: C) where C.Element == Section {
lhs.append(contentsOf: rhs)
}

public func <<<(left: Section, right: BaseRow) -> Section {
left.append(right)
return left
}

public func +=<C : Collection>(inout lhs: Section, rhs: C) where C.Element == BaseRow {
lhs.append(contentsOf: rhs)
}

パスワード設定項目をつくる

作りました。

う〜ん妥協感が否めない。だが今の僕にはこれが精一杯だ!

一応ソースコード載せておきます。Eureka特有の記述方法はすべてサンプルプロジェクトからコピペしました。コピペしただけで意図した動作を実装できたのでビックリしてます。

import UIKit
import Eureka

class SettingController: FormViewController{

override func viewDidLoad() {
super.viewDidLoad()

form

/* パスワード */

+++ Section()

<<< SwitchRow("パスワードを有効にする"){
$0.title = $0.tag
}

+++ Section(footer: "パスワードは数字4文字で入力してください"){
$0.hidden = .function(["パスワードを有効にする"], { form -> Bool in
let row: RowOf<Bool>! = form.rowBy(tag: "パスワードを有効にする")
return row.value ?? false == false
})
}
<<< PasswordRow("パスワードを入力してください"){
$0.title = $0.tag
$0.add(rule: RuleMinLength(minLength: 4))
$0.add(rule: RuleMaxLength(maxLength: 4))

$0.hidden = .function(["パスワードを有効にする"], { form -> Bool in
let row: RowOf<Bool>! = form.rowBy(tag: "パスワードを有効にする")
return row.value ?? false == false
})
}
.cellUpdate {
cell, row in
if !row.isValid {
cell.titleLabel?.textColor = .red
}
}

}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}

}

実装した機能

・「パスワードを有効にする」をONにすると、「パスワードを入力してください」という項目がヌルっと現れます。OFFにすると消えます。
・4文字のパスワードになるように入力チェックをしています。4文字未満、5文字以上だった場合はタイトルが赤くなり警告します。

今後実装予定の機能(本当は実装したかったけど挫折した機能)

・「パスワードを有効にする」をタップすると「Smile-Lock」のパスワード入力画面があらわれて、その画面でパスワード設定したい。

・「パスワードを有効にする」がON&パスワードがちゃんと設定してある場合のみ、アプリ起動時にパスワード入力画面を表示する。
→【実装済 / Splashを使ったら簡単に条件分岐できました。】

・そもそも数字4文字以上を入力できないようにしたい。

・もしも入力チェックに引っかかったら何がダメだったかをアラートで表示したい。(タイトルが赤くなるだけじゃわかんない。)
→【実装済/Eurekaに機能が用意されてた。】

・パスワードを決定する際に「パスワード再設定はできないからきちんと覚えておいてね」などのアラートを表示したい。

・パスワードを保存する機能を未実装なのでそれは次回以降やる。
→【実装済】

・パスワードは数字のみ入力OKするようにしたい。


Category
9WEB