Как правильно использовать объекты 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 должен быть правильный подход.

620   2  

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 в необязательный, и результат использования необязательного оператора cast site?.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

    Ничего не найдено.