2つの配列Data1とData2があり、これらの各文字列(文字列を含む)内のデータを2つの異なるセクションのテーブルビューに挿入します。最初のセクションには「Some Data 1」という見出しがあり、2番目のセクションには「KickAss」というタイトルが付いているはずです。
私は両方のセクションに最初の配列からのデータを入れています(しかし見出しもありません)。
ここに私のコードがあります:
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 2
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
var rowCount = 0
if section == 0 {
rowCount = Data1.count
}
if section == 1 {
rowCount = Data2.count
}
return rowCount
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell
let ip = indexPath
cell.textLabel?.text = Data1[ip.row] as String
return cell
}
cellForRowAtIndexPathメソッドでは、numberOfRowsInSectionメソッドで行ったように、どういうわけかセクションを識別できますか?また、各セクションにタイトルを付けるにはどうすればよいですか?ありがとう
TableViewセル
多次元配列を使用できます。例えば:
let data = [["0,0", "0,1", "0,2"], ["1,0", "1,1", "1,2"]]
セクションの数については、次を使用します。
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return data.count
}
次に、各セクションの行数を指定するには、次を使用します。
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return data[section].count
}
最後に、セルをセットアップする必要があります。
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cellText = data[indexPath.section][indexPath.row]
// Now do whatever you were going to do with the title.
}
TableViewヘッダー
再び配列を使用できますが、今回は1つの次元のみを使用します。
let headerTitles = ["Some Data 1", "KickAss"]
次に、セクションのタイトルを設定します。
override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
if section < headerTitles.count {
return headerTitles[section]
}
return nil
}
上記のコードは、そのセクションのタイトルがあるかどうかを確認して返し、そうでない場合はnil
が返されます。 headerTitles
のタイトルの数がdata
の配列の数よりも小さい場合、タイトルはありません。
結果
以前の回答の代わりに、セクションに属するデータを保持するStruct
を作成できます。例えば:
struct SectionData {
let title: String
let data : [String]
var numberOfItems: Int {
return data.count
}
subscript(index: Int) -> String {
return data[index]
}
}
extension SectionData {
// Putting a new init method here means we can
// keep the original, memberwise initaliser.
init(title: String, data: String...) {
self.title = title
self.data = data
}
}
View Controllerで、セクションデータを次のように設定できます。
lazy var mySections: [SectionData] = {
let section1 = SectionData(title: "Some Data 1", data: "0, 1", "0, 2", "0, 3")
let section2 = SectionData(title: "KickAss", data: "1, 0", "1, 1", "1, 2")
return [section1, section2]
}()
セクションヘッダー
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return mySections.count
}
override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return mySections[section].title
}
以前の回答と比較すると、headerTitles
の数とdata
の配列の数を一致させることを心配する必要はありません。
TableViewセル
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return mySections[section].numberOfItems
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cellTitle = mySections[indexPath.section][indexPath.row]
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell
cell.textLabel?.text = cellTitle
return cell
}
どのセクションにいるかは、indexPath.section
。タイトルを指定するには、関数をオーバーライドします
func tableView(tableView: UITableView!, titleForHeaderInSection section: Int) -> String!