web-dev-qa-db-ja.com

swiftを使用して2つの異なる配列をTableviewの2つのセクションに追加するにはどうすればよいですか?

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メソッドで行ったように、どういうわけかセクションを識別できますか?また、各セクションにタイトルを付けるにはどうすればよいですか?ありがとう

29
Woody

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の配列の数よりも小さい場合、タイトルはありません。

結果

enter image description here

66
ABakerSmith

以前の回答の代わりに、セクションに属するデータを保持する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
}
23
ABakerSmith

どのセクションにいるかは、indexPath.section。タイトルを指定するには、関数をオーバーライドします

func tableView(tableView: UITableView!, titleForHeaderInSection section: Int) -> String!
14
Glorfindel