2016-08-02 11 views
7

Ok, więc znalazłem wiele informacji dotyczących UITableView i wielu sekcji, jednak zawsze są one z ciągami, tablicami, statycznymi danymi, Obj-C lub czymś innym, z czym nie jestem w stanie tłumaczyć na moją sytuację, głównie dlatego, że jestem całkowicie nowy w tworzeniu aplikacji. Każda pomoc jest bardzo doceniana, ponieważ od ponad miesiąca próbowałem różnych podejść bez powodzenia.UITableView z wieloma sekcjami używając Realm and Swift

Więc mam wiele obiektów pies z następujących właściwościach:

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" 
    } 
} 

A w moim pliku ViewController Mam następujący kod (usunąłem nietrafne linie):

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 { 
     // ? 
} 

chciałbym aby organizować sekcje przez obiekt "rasowy" z obiektu Dog, jednak mam bardzo trudny czas, aby to osiągnąć.

Widziałem kilka przykładów, w których używają one wyrażenia "jeśli" dla sekcji, próbowałem tego i nie byłem w stanie uzyskać odpowiednich wyników, jednak chciałbym mieć czystsze podejście, które widziałem w kilku innych przykładach. , używając:

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

Podejmowałem różne próby, ale będąc królestwem DB i szybko mam problemy z podążaniem za większością przykładów.

Dziękuję za poświęcony czas.

Odpowiedz

19

Oto niektóre przykładowy kod, który robi dokładnie to, czego szukasz:

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 
    } 
} 

który wygląda tak:

screenshot

+0

Dziękuję jpsim! Pracował jak urok! – TVDN

+0

To zadziałało również dla mnie. Dziękuję bardzo! Konsekwentnie pod wrażeniem wsparcia dla Królestwa, które znajduję w twojej dokumentacji i tutaj na SO. –

+3

@jpsim czy można to połączyć z powiadomieniami o kolekcji krain? Przykład w dokumentach zakresu pokazuje, jak zaktualizować widok tabeli za pomocą pojedynczej sekcji opartej tylko na powiadomieniach ... dzięki. –

Powiązane problemy