UITableViewController / NSIndexPath / Swift (extension,Array,willSet,didSet) について

今回はUITableViewControllerのサンプルコード触ってみた。

f:id:operando:20150716080613p:plain

コレね。

UITableViewControllerについて

とりあえずUITableViewControllerのReferenceはこれ。

developer.apple.com

UITableViewControllerってAndroidに置き換えると、ListActivityみたいなものっぽい。

あんまりListActivityは使わないから、UITableViewで使うことの方が多そうだなーという印象。

でもUITableViewControllerならNavigationにも手を加えられるから、Listだけの画面なら使ってもよさそう。

そこら辺はAndroidのListActivityとは違うなーって感じ。

Table Viewについて、公式のドキュメント見るとよさそう。

developer.apple.com

Cellの追加・削除

サンプルコードでは、NavigationのAddってボタンを押すと、Cellの数が1つずつ増えていく。

UITableViewのCellを動的に追加・削除することも学べるようにサンプルコードはできてるっぽい。

詳細はこれを読むとわかりやすかった。

UITableViewにcellを動的に追加/削除する2つの方法。 | cocoa*life


UITableViewのinsertRowsAtIndexPathsとdeleteRowsAtIndexPathsでCellを追加・削除できる。

indexPath(NSIndexPath)は、追加なら追加するIndexの位置、削除なら削除するCellのIndexの位置って感じかなー。

// insertRowsAtIndexPathsでCellの追加
tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic)

// deleteRowsAtIndexPathsでCellの削除
tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)


ちなみに、一度に複数Cellを追加・削除する方法もあるみたいなので、それは今度試してみる。

Cellが動的に変化するListを作成するのも、そんなには難しくなさそう!

あと、公式のドキュメントにCellの追加・削除に関することがのってそうなやつ見つけたので貼っておく。

developer.apple.com

NSIndexPath

Cellの追加・削除をする際に、指定するIndexでNSIndexPathってやつが使われてた。

NSIndexPathって何??ってことは、下の記事見るとわかりやすかった。

[XCODE] NSIndexPathとは?作り方や使い方も - YoheiM .NET


以下のような感じで、行(forRow)とセクション(inSection)を指定して作成する。

let indexPath = NSIndexPath(forRow: 0, inSection: 0)


ちなみに、Objective-CのNSIndexPathとSwiftのNSIndexPathは違うのかな??

UITableViewには、extensionしたNSIndexPathが定義されてるっぽい。

kenev.net

Swift extensionとProtocol

NSIndexPathについて調べていたらextensionが出てきて、あれ?Swiftのextensionってなんだっけ??ってなった。

この記事を読むと、ざっくり学べそう。

codezine.jp

エクステンションとは

既存のクラスはもちろんのこと、ストラクチャや列挙型に対してもエクステンションという仕組みを通じて機能を拡張できます。

定義済みの型に対して、メソッドやタイププロパティなどを追加できる。(他にもできることあるよ!)

ざっくりこんな感じ。NSIndexPathもextensionでコンストラクタ(init)とかが追加されてるっぽい。

非常に便利な機能なので、今後もっと詳しく見ていこう。Protocolもね。

Swift 配列(Array)

Swiftの配列について、UITableViewControllerのサンプルコードを見てたらわからない記載があったので、調べてみた。

insertのatIndex?ってこれ どゆこと??ってなった。以下のようなコードね。

objects.insert(NSDate(), atIndex: 0)


Arrayのinsertは、要素を指定位置に挿入する際に使うみたい。

なので、atIndexには挿入したい位置を指定するってことか。

atIndex: 0なら、指定要素は先頭に挿入され、元々の要素はひとつずつ後ろにずれるって感じ。

objects.insert("test1", atIndex: 0) // ["test1"]
objects.insert("test2", atIndex: 0) // ["test2" , "test1"]

以下2つの記事を読むと、さらによくわかると思う。

qiita.com

配列 | Swift言語を学ぶ

Swift willSetとdidSet

これもサンプルコード読んでてわからなかったこと。

以下のようなコードがあった。

var detailItem: AnyObject? {
    didSet {
        // Update the view.
        self.configureView()
    }
}


どうやら値監視の仕組みがSwiftにはあるらしい。それがwillSetとdidSetっぽい。

willSet は値が set される前に呼ばれ、didSet は値が set された後に呼ばれるらしい。

ってことで上のコードは、値がsetされた後にconfigureViewメソッドを実行するってことだね。


willSetとdidSetについて、以下の記事を読むとさらに理解が深まる。

qiita.com

qiita.com

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

  • UIBarButtonItem。AddとかSaveとか色々あるみたい。後々詳しく見てみる
  • editButtonItem。これをNavigationのrightBarButtonItemとかにセットすると、「Edit」ってButtonが追加される。詳しい仕組みがわからない!

まとめ

UITableViewControllerのサンプルコードはまだ全部読めてないので、引き続き読んでいこう。

Swift調べつつ、UIKit Frameworkのことも調べつつってやってるから、調べることいっぱいだー。

でも、理解できるとやっぱり楽しい。

あーこれ前勉強したやつだわーってなって、ちょっとずつ理解できてることを実感できるから頑張ろう。

ひと通りサンプルコード触ったら、自分で小さいアプリを作ってみようかと思う。