web-dev-qa-db-ja.com

レルムとSwift)を使用した複数のセクションを持つUITableView

わかりました。UITableViewと複数のセクションに関する多くの情報を見つけましたが、それらは常に文字列、配列、静的データ、Obj-C、または主に私が完全に自分の状況に変換できない他の何かを含んでいますアプリの開発は初めてです。私がさまざまなアプローチを試みて成功しなかったのは1か月余りでしたので、どんな助けでも大歓迎です。

したがって、次のプロパティを持つ複数のDogオブジェクトがあります。

class Dog: Object {
    dynamic var name = ""
    dynamic var race = ""
    dynamic var age = 0
    dynamic var owner = ""
    dynamic var dogID = ""

    override static func primaryKey() -> String? {
        return "dogID"
    }
}

そして、私のViewControllerファイルには、次のコードがあります(無関係な行を削除しました)。

let realm = try! Realm()
var dogResults : Results<Dog>?

override func viewDidLoad() {
    super.viewDidLoad()

    self.dogResults = realm.objects(Dog.self)

}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return self.dogResults!.count
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
    let dog = self.dogResults![indexPath.row]
    cell.textLabel?.text = dog.name
}

func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        // ?
}

func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        // ?
}

Dogオブジェクトの「race」プロパティでセクションを整理したいのですが、これを実現するのに非常に苦労しています。

セクションに「if」ステートメントを使用する例をいくつか見ましたが、それを試しましたが、適切な結果を得ることができませんでしたが、他のいくつかの例で見たよりクリーンなアプローチが必要です。

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return data[section].count
}

私はさまざまな試みをしましたが、レルムDBであり、Swiftほとんどの例に従って問題が発生しています。

お時間をいただきありがとうございます。

14
TVDN

これがあなたが探していることを正確に行ういくつかのサンプルコードです:

import UIKit
import RealmSwift

class Dog: Object {
    dynamic var name = ""
    dynamic var race = ""
    dynamic var age = 0
    dynamic var owner = ""
    dynamic var dogID = ""

    override static func primaryKey() -> String? {
        return "dogID"
    }

    convenience init(name: String, race: String, dogID: String) {
        self.init()
        self.name = name
        self.race = race
        self.dogID = dogID
    }
}

class TableViewController: UITableViewController {
    let items = try! Realm().objects(Dog.self).sorted(["race", "name"])
    var sectionNames: [String] {
        return Set(items.valueForKeyPath("race") as! [String]).sort()
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")

        let realm = try! Realm()
        if realm.isEmpty {
            try! realm.write {
                realm.add(Dog(name: "Bailey", race: "Golden Retrievers", dogID: "0"))
                realm.add(Dog(name: "Bella", race: "German Shepherds", dogID: "1"))
                realm.add(Dog(name: "Max", race: "Bulldogs", dogID: "2"))
                realm.add(Dog(name: "Lucy", race: "Yorkshire Terriers", dogID: "3"))
                realm.add(Dog(name: "Charlie", race: "Bulldogs", dogID: "4"))
                realm.add(Dog(name: "Molly", race: "German Shepherds", dogID: "5"))
                realm.add(Dog(name: "Buddy", race: "German Shepherds", dogID: "6"))
                realm.add(Dog(name: "Daisy", race: "Siberian Huskies", dogID: "7"))
            }
        }
    }

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return sectionNames.count
    }

    override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        return sectionNames[section]
    }

    override func tableView(tableView: UITableView?, numberOfRowsInSection section: Int) -> Int {
        return items.filter("race == %@", sectionNames[section]).count
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath)
        cell.textLabel?.text = items.filter("race == %@", sectionNames[indexPath.section])[indexPath.row].name
        return cell
    }
}

これは次のようになります:

screenshot

31
jpsim