見出し画像

Swift 4 で TableView を使ってみる

さて、TableViewでイカしたUIを作ってやろう!と思ったら意外にTableViewを使いこなすのが難しかったので、メモを残しておきます。
このメモを読めばテーブルビューなんて楽勝?

1.ストーリーボードを設定しよう

何をするにも、まずストーリーボード上にオブジェクトを置かないと、始まらない。まず、TableViewを画面上に配置しよう!

配置したら、Constraintsを設定してTable ViewをiPhone画面全体に表示できるように調整しよう!Add New Constraints の下にある□マークの周りの数字(4箇所)にゼロを代入して、画面全体に表示させることができるぞ。

これだけでは部品が足りない。TableViewに必要なもう一つの部品Table View Cellを選択して、Table Viewにドラッグ&ドロップしよう!このCellとは行の意味で、TableViewはCellを入れておく箱のようなもので、たくさんのCellデータをTableViewで表示することができるんだ。

Cellを追加すると左上に⚠︎が出てくると思う。「CellにIdentifierが必要」と言ったエラーがね。Identifierとは直訳で識別子という意味なんだが、つまりは固有名詞だ。このエラーは、「いくつもCellがあったら、名前つけないとCellがたくさんあったら識別できないだろうがぁ!この●●が!」と言っているんだ。
怒られる前に、Cell名を決定するのが賢明だな!

Table View Cell を選択した後、右上にあるattributes inspectorを選択しよう(▼とーを足したみたいなマーク)!その中の、「Identifier」に自分の好きなCell名を入力しよう!今回は「Baka_Cell」としたぞ!

2.コードと紐ずける

このままだと、ViewController.swift(コード)がTableViewを認識してくれないので、コードとstory boardを紐ずけよう!右上にある、世紀末のオリンピックマーク(丸が二つ合体してるやつ)をクリックして、二画面化しよう。
二画面かしたらTable ViewをControlを押したままドラッグして、マウスカーソルから出現する青い不思議な棒を出そう!そのまま、「ViewDidLoad」の上の行にドラックだ!そうすると上の写真のような画面になるぞ!
この不思議な青い棒は、オブジェクト?の紐付けによく使うので覚えておこう!
そうしたらNameのところに、コード上で使うTableViewの名前を入力だ!今回は「TableView」としたぞ!

次に、Delegate, DataSourceの関連づけを行おう!
右上にある、⇨+●マークを選択してオブジェクト?の接続設定ができるぞ。今回は、TableViewを選択してTableViewのDataSource、Delegateの右にある●をドラッグして謎の青い線を出そう!青い線が出たら、

上画像に「ViewController」と吹き出しが出てる場所の下、黄色い●+□マークの場所にドラッグしよう!そうすると上画像のように DataSouceがViewController(コード)と関連ずけされるぞ!同じようにDelegateも関連ずけしよう!
こいつらがなんなのかって?難しいことを聞くね!私もよくわからん!
(ちょっと説明すると、DataSouceとDelegateは、TableViewCellの高さや値、文字などのデータを設定できるんだ。今回は、それらの設定をViewControllerで行うので、ViewControllerに関連づけを行なったぞ!)

3.コードをイジイジする

さて、今度はコードをいじっていこう!

上の画面を表示したら、
以下の部分を、

class ViewController: UIViewController {

以下に変更しよう!

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

変更すると右に赤い□+●が出てくるかもしれないけど気にするな!
このコードの変更により、UITableViewDelegateとUITableViewDataSourceに依存したコードが使えるようになったぞ!内容的にはCell変更とかだ。

UITableViewDelegateとUITableViewDataSourceを追加すると、画像のような感じで怒られると思う。でも、これは怒られているわけではないのだ!UITableViewDelegateとUITableViewDataSourceを設定できるプロトコルがあるけど、コードの中には存在しないよ。プロトコルを追加するかい?と言っているんだ。パーフェクトだ!
自動で追加してくれるなんてありがたい!
喜んで「FIX」を押そう!

FIXを押すと、

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
       <#code#>
   }
   
   func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
       <#code#>
   }

が追加されるぞ!

追加されたら、ちょっとこいつらは放っておいて、以下のコードを追加しよう。

//MARK:関数設定
   let List = ["ニック","ひかり","タオ","キャサリン","リトルマック","トレイシー"]

追加場所は、

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

の下の行あたりに追加してくれ!

このListはテーブルビューに表示される文字だ!これからこのリストが、テーブルビューに表示されるように設定していくぞ。

先ほどFIxで追加された、

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
       <#code#>
   }
   
   func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
       <#code#>
   }

を以下のように変更しよう!

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
       //一つのセクションに入れるCellの数を指定する。
       return List.count
   }
   
   func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
       //Cellの内容を設定する。
       let cell = tableView.dequeueReusableCell(withIdentifier: "Baka_Cell", for: indexPath)
       cell.textLabel?.text = List[indexPath.row]
       return cell
   }

これで、Cellの設定は完了だ!
内容を知りたいって?そうだな。

まずは上の部分、

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
       //一つのセクションに入れるCellの数を指定する。
       return List.count
   }

の説明をするぞ!これはテーブルビュー内のセクションに何個のCellをおくかを定義するぞ!ん?そんなん嘘だって?
試しにList.countの部分を3にしてみるといい。リストにはタオまでしか表示されなくなるぞ!
ここで使っている、return 数字 の数字はかなり大事だぞ!この数字が下の部分に関わってくる。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
       //Cellの内容を設定する。
       let cell = tableView.dequeueReusableCell(withIdentifier: "Baka_Cell", for: indexPath)
       cell.textLabel?.text = List[indexPath.row]
       return cell
   }

下の部分の説明だ!ここはCellの内容を設定するぞ。
let cell = 〜 で、story boardにて作ったBala_Cellとの関連づけを行なっているぞ。その関連ずけをおこなったCellに
cell.textlabel〜 で、Listの内容をCellに代入するんだ。
その後、 return cell でテーブルビューに反映すると。

ここまで、説明するとなんかわかった気になると思うがよく見て欲しい。
indexPath.rowってなんだ?これは、選択されたcell(行)の番号が入るんだ。
何を言っているかわからないって?

わかりやすく、処理を流れにして書こう

1.let cell = ~ 「ストーリーボードにある、Baka_CellというCellの1行目(indexPath.row = 0)に代入設定する。」
2.cell.textLabel?〜 「Baka_cellの一行目に、Listの最初の値(ニック)を代入する。
3.一行目のデータ(ニック)を返す

こんな感じで処理されるんだ。ん?なんだって?この処理だと、6回ループしないと全ての値(トレイシーまで)が入らないって?
何を言っているんだ!この部分はループするんだよ。

実はこの部分、先ほど言った 上の部分の数字(今回の場合は、return List.count)の回数ループするんだ!ループすることにより

一度目(indexpath=0)はニックを
二度目(indexpath=1)はひかりを、
三度目は....
六度目は(indexPath=5)トレイシーを代入する。

そんな感じで、「List.count(6)」回ループすることによってCellに代入を行うんだ。

ループの様子を確認したければ、

//Cellの内容を設定する。
       print(indexPath)
       let cell = tableView.dequeueReusableCell(withIdentifier: "Baka_Cell", for: indexPath)
       cell.textLabel?.text = List[indexPath.row]
       return cell

と書き換えることによって、六回ループしていることが確認できると思うぞ。

最終的なコードは以下の感じになるぞ!

さて、実行をしてちゃんと以下のようにリストが表示されたかな?

なにぃ!画面上部が青くならないって!
大丈夫だ。これはマクドナルドのWifiが使えず、iPhoneでテザリングして、この記事を書いている私の仕様なので気にしないで。

今回は以上!今後も気まぐれでSwiftの記事を投稿するかもしれないぞ。

またね!

この記事が気に入ったらサポートをしてみませんか?