Segue / TableView周り / Xcode Key bind について

今回も引き続きUITableViewControllerのサンプルコード触ってみた。

f:id:operando:20150716080613p:plain

コレね。

画面遷移・Segueについて

サンプルコードでは、一覧ベージから詳細ページへの画面遷移が実装されています。

正直、今までココらへんの画面遷移周り全く調べてなかった・・・。

次の画面へのデータの受け渡しとか、画面からの戻りをハンドリングしたりとかできるのかなーってレベル。まあできるよね。


んで、調べてみた感じSegueというのがあるらしい!

Segueが具体的に何かはまず置いといて、これを使えば画面遷移できるみたい。

Segueで画面遷移する前には、prepareForSegueメソッドが呼ばれるので、ここで遷移先のViewControllerをインスタンス化して画面に渡したいデータとかも一緒に突っ込んであげればいいっぽい。

こんな感じ!identifierは、Segueにつける識別子っぽくて、これでどの画面遷移のAction?なのか識別できる。

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "showDetail" {
        if let indexPath = self.tableView.indexPathForSelectedRow() {
            let object = objects[indexPath.row] as! NSDate
            (segue.destinationViewController as! DetailViewController).detailItem = object
        }
    }
}


以下の記事を読むと理解しやすかった。Xcode 6からSegueも色々変わってるみたい。

qiita.com

dev.classmethod.jp

公式のドキュメントにはSegue Typesがまとまってるからこっちも見るとよさそう。

developer.apple.com


AndroidのIntentに慣れてると、ここは全然違うなーという印象。

willSelectRowAtIndexPath / didSelectRowAtIndexPathについて

TableViewのCellを選択した際に実行するメソッドってないのかなーと探してたらそれっぽいのがあった。

それが willSelectRowAtIndexPathとdidSelectRowAtIndexPathっぽい。

どうやらUITableViewDelegateのメソッドっぽい。とりあえずUITableViewDelegateのReference貼っておく。

ドキュメントに色々わかりやすく説明が書いてあるので、そこ読むのオススメ。

developer.apple.com


willSelectRowAtIndexPathは、タッチした際にその行選択を有効/無効に判別したりする直前の処理。nilとかを返すと、行の選択が無効になったことになるっぽい。

didSelectRowAtIndexPathは、実際に選択された後の処理って感じですね。

使い道として、willSelectRowAtIndexPathは特定行だけ選択を無効にするとか。didSelectRowAtIndexPathは選択したらダイアログを出したり色々できそう!

cellForRowAtIndexPathについて

UITableViewControllerのサンプルコードを見てて、Cellの数が多くて画面内に収まらない場合ってどうなるのかなー?って思った。

ちょっと調べた感じcellForRowAtIndexPathメソッドがそこら辺関係してそう。

んで、この記事がとても役立った!この記事ありがたい!

d.hatena.ne.jp


上の記事でも書いてあるように、cellForRowAtIndexPathメソッド

テーブルの行を表示する必要が生じるたびに cellForRowAtIndexPathメソッドを呼び出します。

ってことらしい。なるほど。

ちなみに、サンプルコードだとこんな感じで実装してる。毎回UITableViewCellを作成して返してます。

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    // 「cellForRowAtIndexPath:」で指定したインデックスパスのセル(UITableViewCell)を作成し,そのインスタンスを返す
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell

    let object = objects[indexPath.row] as! NSDate
    cell.textLabel!.text = object.description
    return cell
}

んじゃ、AndroidみたいにViewのリサイクルってできないの?ってところがまだ疑問に残ってること。

Viewのリサイクルについては、iOSエンジニアに聞いてみるほうが早そうだ。

Xcode Key bind

なんかXcode使いにくいなー!って思ってたら、Key bind覚えてなかった。。。

とりあえず ctrl + .で入力補完覚えたから無敵!

こことか見たけど、もっとまとまってそうなの探そー。

techacademy.jp

気になったけどわかってないこと

  • プロジェクトの.gitignoreってどうするのがベストなんだろー??
  • PlaygroundでNSCalendar使ったんだけど表示が出ない・・・

まとめ

ちょっとずつXcodeにも慣れてきた。

まだ特定の操作を繰り返しやってるだけだが、これの積み重ねで覚えていくしかないっすよね。

Android勉強した時もそうだったけど、とにかく反復練習してOutputしまくる。

ちなみに、新しいiPod touchを発表当日に買いに行きました。銀座のApple Store行って。

青の32G買った。Xcode 7 bateで実機実行した時の感動はすごかった。

よし、これからも頑張る!