为什么我的 fetchedResultsController.ObjectAtIndexPath return NSFetchRequestResult 而不是对象?
Why does my fetchedResultsController.ObjectAtIndexPath return NSFetchRequestResult instead of an object?
我认为这将是一件简单的事情,但由于某些未知原因,我无法在给定的 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
,我有这个扩展,我在其中放置了所需的 table 视图方法。我可以在 numberOfSectionsInTableView
和 numberOfRowsInSection
方法中毫无问题地访问视图模型的 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)
应该 return 公式 object 在获取结果中给定的索引路径。但是 formula
认为它是一个 NSFetchRequestResult
,所以我当然不能访问任何公式属性。
NSFetchRequestResult
是 NSManagedObject
、NSDictionary
、NSManagedObjectID
和 NSNumber
遵守的协议。您需要对对象进行类型转换:
let formula = viewModel.fetchedResultsController.objectAtIndexPath(indexPath) as! Formula
我认为这将是一件简单的事情,但由于某些未知原因,我无法在给定的 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
,我有这个扩展,我在其中放置了所需的 table 视图方法。我可以在 numberOfSectionsInTableView
和 numberOfRowsInSection
方法中毫无问题地访问视图模型的 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)
应该 return 公式 object 在获取结果中给定的索引路径。但是 formula
认为它是一个 NSFetchRequestResult
,所以我当然不能访问任何公式属性。
NSFetchRequestResult
是 NSManagedObject
、NSDictionary
、NSManagedObjectID
和 NSNumber
遵守的协议。您需要对对象进行类型转换:
let formula = viewModel.fetchedResultsController.objectAtIndexPath(indexPath) as! Formula