2017-02-01 7 views
0

Я успешно загружаю и печатаю данные из базы данных Realm. Вот мой журнал:Представить список элементов в tableview из базы данных Realm

Item(id: Optional(0), name: Optional("Item (0)"), descr: Optional("Description of item (0)"), 
    icon: Optional("http://192.168.1.101:8080/api/items/0/icon.png"), 
    url: Optional("http://192.168.1.101:8080/api/items/0"))) 

Теперь я должен назначить эти значения в списке, и я получаю чистый лист TableView. Как это сделать правильно? Я использую .xib как tablewViewCell. Я благодарен за любые советы.

class ItemRealm : Object { 
    dynamic var id = 0 
    dynamic var name = "" 
    dynamic var desc = "" 
    dynamic var icon = "" 


    override class func primaryKey() -> String? { 
     return "id" 
    } 
} 


class ViewController: UIViewController, UITableViewDataSource, UISearchBarDelegate { 

    @IBOutlet weak var searchBar: UISearchBar! 
    @IBOutlet weak var tableView: UITableView! 


    let realm = try! Realm() 
    let results = try! Realm().objects(ItemRealm.self).sorted(byKeyPath: "id") 

    let SERVER_URL = "http://192.168.1.101:8080/api/items" 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     Alamofire.request(SERVER_URL).responseJSON { response in 
      let items = [Item].from(jsonArray: response.result.value as! [Gloss.JSON]) 
      print(items?[0] as Any) 

      try! self.realm.write { 
       for item in items! { 
        let itemRealm = ItemRealm() 
        itemRealm.id = item.id! 
        itemRealm.name = item.name! 
        itemRealm.desc = item.descr! 
        itemRealm.icon = item.icon! 
        self.realm.add(itemRealm) 
       } 
      } 
      _ = self.realm.objects(ItemRealm.self) 
      // print(items?[0] as Any) 
     } 
     // Do any additional setup after loading the view. 
     tableView.register(UINib(nibName: "TableViewCell", bundle: nil), forCellReuseIdentifier: "TableViewCell") 
    } 

    // MARK: - UITableView data source 
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return results.count 
    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell") as! TableViewCell 

     var object: ItemRealm 
     object = self.results[indexPath.row] as ItemRealm 

     cell.item = object 

     return cell 
    } 

} 
+0

Вы связали делегатов tableView? Является ли results.count определенно> 0 и называется ли 'cellForRowAt'? – Russell

+0

Да, они связаны. После отладки -> po results.count - это дает мне 0..cellForRow даже не вызывается. – Vuko

+0

Если result.count == 0, 'cellForRowAt' никогда не будет вызван - значит, проблема не в tableView, а в поиске данных. – Russell

ответ

0

Я думаю, что вам не хватает «self.tableView.reloadData()» после получения данных от ответа. Подумайте также о том, чтобы вывести полученные данные в вашу переменную результатов.

+0

Это не помогает, к сожалению. Что вы имеете в виду с полученными данными, может ли привести пример? – Vuko

+0

Измените 'results' на переменную и измените эту строку: '_ = self.realm.objects (ItemRealm.self)' to 'self.results = self.realm.objects (ItemRealm.self)' после этого вызова self.tableView .reloadData()» –