为什么我的fetchedResultsController.ObjectAtIndexPath返回NSFetchRequestResult而不是对象?

时间:2017-03-23 14:26:03

标签: swift core-data nsfetchedresultscontroller

我认为这是一个直截了当的事情,但由于某些未知的原因,我无法在给定的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)
    }
}

结果是一组Formula对象。

回到我的UITableViewController,我有这个扩展,我在其中放置了所需的表视图方法。我可以在fetchResultsControllernumberOfSectionsInTableView方法中访问视图模型的numberOfRowsInSection,没有任何问题。在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,因此我无法访问任何公式属性。

1 个答案:

答案 0 :(得分:0)

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

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