質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

3997閲覧

tableViewメソッド内のいろいろについて謎があるので、質問させていただきます。

Blue0999

総合スコア148

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

1クリップ

投稿2016/04/22 12:54

編集2016/04/22 12:57

一番下のコードは参考書のサンプルアプリに書いてあったものです。
質問したい事⤵︎
tableView.dequeueReusableCellWithIdentifierメソッドの役割ついて
tableView.dequeueReusableCellWithIdentifierメソッドの引数に与えたindexPathについて
todoList[indexPath.row] のindexPath.rowの部分について

tableView.dequeueReusableCellWithIdentifierメソッドは何をしてくれるメソッドなのでしょうか?ちなみに引数の"todoCell"はメインストーリーボードで指定したTableViewCellの識別子名です。

tableView.dequeueReusableCellWithIdentifierメソッドの引数に与えたindexPathは何を表すのでしょうか?前回の質問でsectionとrowというプロパティがあるという事を教えて頂きましたが、indexPath(NSIndexPathのインスタンス)を中に定義されたプロパティを参照する訳でもなくそのまま引数として使うというのはどういう意味でしょうか?

変数todoListは文字列型の配列ですのでtodoList[indexPath.row]のindexPath.rowの部分は整数だと思います。rowについてはこれも前回の質問で教わりましたが、indexPath.row←このような書き方だと何番目のrowかは特に指定されていないと思うのですがどういう基準で整数が選ばれているのでしょうか?

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("todoCell", forIndexPath: indexPath)
let todoTitle = todoList[indexPath.row]
cell.textLabel!.text = todoTitle
return cell
}

質問が長くなってしまってすみません。質問に不備などがありましたら教えていただけると幸いです

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

tableView.dequeueReusableCellWithIdentifierメソッドの役割ついて

tableView.dequeueReusableCellWithIdentifierメソッドの引数に与えたindexPathは何を表すのでしょうか?

UITableViewのセルの使いまわしについて

Obj-Cで古い記事ですがセルの使い回しに付いて書かれているので
dequeueReusableCellWithIdentifierメソッドの意味がわかると思います。
dequeueReusableCellWithIdentifier:forIndexPath:は使い回すIndexPathを渡しています。

渡されてきたNSIndexPathは次に画面に現れるセルの番号(Sectionとrow)なのでその番号をメソッドに渡して処理をしています。

変数todoListは文字列型の配列ですのでtodoList[indexPath.row]のindexPath.rowの部分は整数だと思います。rowについてはこれも前回の質問で教わりましたが、indexPath.row←このような書き方だと何番目のrowかは特に指定されていないと思うのですがどういう基準で整数が選ばれているのでしょうか?

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
というUITableViewDataSourceに定義されているメソッドは初回のテーブル生成時(画面に見えている分のみ)、テーブルをスクロールして新しいセルが生成 or 使い回しされるタイミングで自動で呼ばれるメソッドです。

そして先ほども書きましたが、次に生成されるセルの番号(Sectionとrow)が渡されてくるので、そのセルに紐付いたデータを渡す事になります。

var dataArray = ["A", "B", "C", "D", "E"]
上の様なデータの配列があった場合に
dataArray[indexPath.row]と記述すると生成される番号に紐付いたデータが自動で渡される事になります。
※この場合はindexPath.rowは配列数と同じになるので0〜4が渡されて来ます。

0番目のセルは"A"、1番目のセルは"B"の様に自動でそのセルに紐付いたデータが取得されていきます。

Sectionとrowはいろいろ試行錯誤しないと分かりにくいところかと思います。
以下にSection分けしたシンプルなUITableViewのコードを貼っておくのでそのまま実行して動きを確かめてみてください。

swift

1import UIKit 2 3class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 4 5 var myTableView: UITableView! 6 7 // Section Header 8 let sectionTitleArray = ["Alphabet Num","Number","Alphabet Small","Alphabet Capital"] 9 10 // Data Array 11 var dataArray1 = ["One","Two","Three","Four","Five"] 12 var dataArray2 = ["1","2","3","4","5"] 13 var dataArray3 = ["a","b","c","d","e"] 14 var dataArray4 = ["A",",B","C","D","E"] 15 var dataArrayGroup: [[String]] = [] 16 17 override func viewDidLoad() { 18 super.viewDidLoad() 19 20 myTableView = UITableView(frame: UIScreen.mainScreen().bounds, style: .Plain) 21 myTableView.delegate = self 22 myTableView.dataSource = self 23 view.addSubview(myTableView) 24 25 // Make Data 26 dataArrayGroup.append(dataArray1) 27 dataArrayGroup.append(dataArray2) 28 dataArrayGroup.append(dataArray3) 29 dataArrayGroup.append(dataArray4) 30 31 myTableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "Cell") 32 } 33 34 // MARK: - TableView Delegate & DataSource 35 36 func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 37 return sectionTitleArray[section] 38 } 39 40 // Section Count 41 func numberOfSectionsInTableView(tableView: UITableView) -> Int { 42 return dataArrayGroup.count 43 } 44 45 // Row Count 46 func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 47 return dataArrayGroup[section].count 48 } 49 50 // Row Height 51 func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 52 return 44 53 } 54 55 // Generate Cell 56 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 57 print("indexPath.section = \(indexPath.section), indexPath.row = \(indexPath.row)") 58 59 let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) 60 let dataArray = dataArrayGroup[indexPath.section] 61 cell.textLabel?.text = dataArray[indexPath.row] 62 return cell 63 } 64 65 // Select Cell 66 func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 67 tableView.deselectRowAtIndexPath(indexPath, animated: true) 68 } 69}

実行イメージ
image

投稿2016/04/22 17:08

_Kentarou

総合スコア8490

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Blue0999

2016/04/24 07:18

遅くなってすみません…。ご回答ありがとうございます。 わざわざプログラムまで作っていただき誠にありがとうございます! 新しくSingleViewApplicationを立ち上げさっそく試してみました。プログラムを理解する事に思ったよりとても長く時間がかかってしまいました…。しかしメソッドtableViewのブロック内のprint文が決め手でようやくコードの大部分を理解する事ができました! そして僕が質問した内容を改めて見るとこれも理解できるようになりました。
guest

0

dequeueReusableCellWithIdentifier()はセルを再利用するためのものです。再利用可能なセルがあれば、それを返してきます。

引数のindexPathは、テーブル上の位置に基づいてセルをセットアップするために利用されます。

indexPathのrowは、行番号です。行そのものではありません。

投稿2016/04/22 16:52

Stripe

総合スコア2183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問