【swift】Todoアプリ作成に関するなんじゃらほい

f:id:utr066:20170312005640p:plain Todoアプリ作成中にわからないことが多かったので、備忘録。

ViewWillAppear??

タイミングによっては、 viewDidLoadより、 viewWillAppear, viewDidAppearで行ったほうが良い処理もあったりしますが、 viewDidLoadとは違い、後者の2つのメソッドは、他の画面に遷移して戻ってきた時にも発火してしまうので、一度だけ処理を行いたいものも何度も呼ばれてしまう可能性があります。

viewDidLoad:View が初めて呼び出される時に1回だけ呼ばれます。 viewWillAppear:View が表示される直前に呼ばれるメソッド viewDidAppear:View の表示が完了後に呼び出されるメッソド

performSegue

画面遷移を行うメソッドみたい。

1.storyboardで画面遷移の設定

Storyboard で FirstViewController を Ctrl + ドラッグで SecondViewController へつなぐ。identifier を設定しておく。

2.画面遷移を行いたいタイミングで performSegue を呼ぶ。

func segueToSecondViewController() {
    self.performSegue(withIdentifier: "toSecondViewController", sender: nil)
}

これで例えば、ボタンをクリックして画面遷移したいって時にはこんな感じでできるのね。

let rightBarButtonItem = UIBarButtonItem(title: "次ページ", style: UIBarButtonItemStyle.plain, target: self, action: #selector(self.segueToSecondViewController))

     func segueToSecondViewController() {
         self.performSegue(withIdentifier: "toSecondViewController", sender: nil)
     }

UITapGestureRecognizerって?

UITapGestureRecognizer これはタップを認識させたいときに使うみたいね。 例えば、TextFieldに入力させ、キーボード以外の部分をタップした時にキーボードを消したい!というときには以下の様な感じか。

@IBOutlet weak var myTextField: UITextField!
    let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(tapGesture))
        self.view.addGestureRecognizer(tapRecognizer)

    func tapGesture(sender: UITapGestureRecognizer){
        myTextField.resignFirstResponder()
    }

これでタップすればキーボードは消える。

TextFieldとTextViewのキーボードをreturnキーで消す

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        todoField.resignFirstResponder()
        return true
    }
    
    func shouldChangeTextInRange(_ textView: UITextView) -> Bool {
        descriptionView.resignFirstResponder()
        return true
    }

上がTextFieldで下がTextView。なるほど。

画面戻る

モーダルで画面遷移した場合、以下のメソッドで前の画面に戻ることができる。

self.dismiss(animated: true, completion:nil)

enum

重要度を表すものをtodoに入れたい。enumを使ってみる。 重要度が高いものと低いものがあると考える。高いのがHighで1。低いのがLowで0。

enum TodoRank:Int {
    case Low = 0
    case High = 1
}

class Todo: NSObject {
    var title = ""
    var rank: TodoRank = .Low
}

デフォルトでLow。

@IBOutlet weak var rankSegment: UISegmentedControl!


todo.rank = TodoRank(rawValue: rankSegment.selectedSegmentIndex)

UISegmentedControl の項目は 0 から始まるインデックス番号で管理されているので、selectedSegmentIndexをつけることにより数字を手に入れることができる。

collectionモデル

swiftにはなにやらモデルをまとめて扱うクラスのようなものがあるらしい。それが、collectionモデル。 Todoはいくつもあり、それら全体を管理するのがこのモデル。

UserDefaults

情報を保存しておく時に必要みたい。Todoを保存いても再起動したら保存いたものは消えてしまう。それを防ぐために、UserDefaultsを使う。使うことによって、再起動後でもデータが保存された状態になる。

let defaults = UserDefaults.standard

まとめ

swiftむずいな。