Как правильно использовать объекты Realm в UITableViewController?
Я пытаюсь использовать Realm в своем UITableViewController, и у меня возникают проблемы всякий раз, когда я пытаюсь найти объект в индексе строки, если я приведу объект к его классу (простите меня, если я использую неправильную терминологию, я все еще довольно новичок в Swift, Realm ans iOS dev!)...
У меня есть класс Site, который выглядит так, и база данных имеет несколько тысяч записей:
class Site: RLMObject {
var id: String = ""
var name: String = ""
}
В моем контроллере табличного представления, когда я пытаюсь получить Site на основе его индекса в результирующем наборе для загрузки в клетку, если я пытаюсь бросить его в объект Site, он всегда равен нулю! Если я позволю ему быть установленным с помощью AnyObject, то я могу видеть, что правильный сайт в этом индексе действительно был найден.
Я предполагаю, что вызов .name на AnyObject работает только потому, что AnyObject отвечает на .name, но это помогает мне увидеть, что индекс правильный и что сайт действительно существует...
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = self.tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell
let allSites = Site.allObjects()
var any: AnyObject = allSites.objectAtIndex(UInt(indexPath.row))
var site = allSites.objectAtIndex(UInt(indexPath.row)) as? Site
println("With AnyObject: (any.name)")
println("With casting: (site?.name)")
return cell
}
Результат приведенных выше операторов печати выглядит следующим образом (например, на сайте, который называется 'Addeboda'):
With AnyObject: Addeboda
With casting: Optional("")
Я делаю что-то не так? Я немного погуглил, и все учебники и ответы, которые я могу найти в подобных направлениях, предполагают, что results.objectAtIndex(index) as Class должен быть правильный подход.
2 ответов:
Гипс не требуется
Похоже, что кастинг на сайт не нужен. Это прекрасно работает:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = self.tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell let allSites = Site.allObjects() let site: AnyObject! = allSites[UInt(indexPath.row)] cell.textLabel!.text = site.name println("Site is: \(site.id)") return cell }, кажется, ошибка с SWIFT или области. Я предполагаю, что один из них запутывается, когда понижает
AnyObject!к чему-то.Инициализация нового экземпляра с правильным типом
Однако, если вам действительно нужно использовать класс модели
Site, Вы можете инициализировать новыйRLMObjectиз результата:override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = self.tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell let allSites = Site.allObjects() let site = Site(object: allSites[UInt(indexPath.row)]) cell.textLabel!.text = site.name println("Site is: \(site.id)") return cell }Первая попытка
К сожалению, я слышу, что вы возникли проблемы с Риэлмом и Свифтом. Я ни в коем случае не Swift pro, но похоже, что вы бросаете
siteв необязательный, и результат использования необязательного оператора castsite?.nameтакже является необязательным. Отсюда получениеOptional("").Можете ли вы попытаться увидеть, если вам больше повезет со следующим?
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = self.tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell let allSites = Site.allObjects() if var site = allSites[UInt(indexPath.row)] as? Site { println("Site is: \(site.name)") } else { println("it not castable to Site. It is: \(toString(allSites[UInt(indexPath.row)].dynamicType))") } return cell }Также можно использовать
yourObject.dynamicTypeдля получения ссылки на реальный тип класса objects.Удачи
Вот некоторый код из примера проекта tableview :
class TableViewController: UITableViewController { var array = DemoObject.allObjects().sortedResultsUsingProperty("date", ascending: true) ... override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as Cell let object = array[UInt(indexPath.row)] as DemoObject cell.textLabel?.text = object.title cell.detailTextLabel?.text = object.date.description return cell } }Вы должны быть в состоянии бросить на линии, которую вы храните, что indexPath.объект строки
Comments