【问题标题】:Why does my fetchedResultsController.ObjectAtIndexPath return NSFetchRequestResult instead of an object?为什么我的 fetchedResultsController.ObjectAtIndexPath 返回 NSFetchRequestResult 而不是对象?
【发布时间】:2017-03-23 14:26:03
【问题描述】:

我认为这将是一件直截了当的事情,但由于某些未知原因,我无法访问给定 indexPath 的对象属性。

我正在尝试尽可能多地使用 MVVM 创建我的应用程序(仍然使用 Swift 2.3),因此我的 UITableViewController 由一个名为 FormulasViewModelFromLiftEvent 的视图模型支持。视图模型使用fetchedResultsController 初始化,如下所示:

struct FormulasViewModelFromLiftEvent {
    var modelLiftEvent: LiftEventProtocol
    var fetchedResultsController: NSFetchedResultsController
    let dataManager = CoreDataHelper()

    init(withLiftEvent liftEventModel: LiftEventProtocol) {
        self.modelLiftEvent = liftEventModel

        let moc = modelLiftEvent.context
        fetchedResultsController = dataManager.fetchSelectableFormulas(moc)
    }
}

结果是公式对象的集合。

回到我的UITableViewController,我有这个扩展,我在其中放置了所需的表格视图方法。我可以在numberOfSectionsInTableViewnumberOfRowsInSection 方法中毫无问题地访问视图模型的fetchResultsController。在cellForRowAtIndexPath 中,我想用公式名称属性填充单元格,但我无法访问objectAtIndexPath 的任何属性:

extension FormulasViewController: UITableViewDataSource {

  override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    guard let sections = viewModel.fetchedResultsController.sections else { return 0 }
    return sections.count
  }

  override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    guard let section = viewModel.fetchedResultsController.sections?[section] else { return 0 }
    return section.numberOfObjects
  }

  override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        let cellViewModel: SelectionsRepresentable

        let cell = tableView.dequeueReusableCellWithIdentifier("formulasCell", forIndexPath: indexPath)

        let formula = viewModel.fetchedResultsController.objectAtIndexPath(indexPath)
        let formulaName = formula.    <-- None of the Formula properties are available

        cellViewModel = FormulaSelectionViewModel(defaultFormulaName: formulaName)

        cell.textLabel?.text = cellViewModel.text
        cell.accessoryType = cellViewModel.accessoryType

        return cell
      }
}

根据文档,let formula = viewModel.fetchedResultsController.objectAtIndexPath(indexPath) 应该在获取结果的给定索引路径处返回公式对象。但是formula 认为它是NSFetchRequestResult,所以我当然无法访问任何公式属性。

【问题讨论】:

    标签: swift core-data nsfetchedresultscontroller


    【解决方案1】:

    NSFetchRequestResult是协议NSManagedObjectNSDictionaryNSManagedObjectIDNSNumber符合。您需要键入转换对象:

    let formula = viewModel.fetchedResultsController.objectAtIndexPath(indexPath) as! Formula
    

    【讨论】:

    • 谢谢,@vadian。我查看了一些我拥有的教程,这些教程没有强制转换,但是,它们在 Swift 3 中。这是 Swift 2.3 和 3 之间的区别吗?
    • 在 Swift 3 中 NSFetchedResultsController 是通用的。所以你可以通过静态类型初始化控制器。
    猜你喜欢
    • 1970-01-01
    • 2011-10-19
    • 2011-10-06
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    • 2011-08-15
    相关资源
    最近更新 更多