【发布时间】:2019-09-16 07:20:51
【问题描述】:
我正在制作一个使用 Core Data 的应用程序,碰巧在这个应用程序中我有三个 tableViews 填充了不同的数据,并且它们都在不同的控制器中,以避免重复代码(因为它完全相同)我想要解决这个问题。
我尝试过通过协议和继承自 UIViewController 的 MainController,后者又具有 NSFetchedResultsControllerDelegate 的扩展。 我几乎肯定的是,我可以在其中放置此代码的超级类是解决方案,但由于我是 swift 和编程的新手,而且我也很肯定有些事情我没有按照预期的那样做。
在父类中我做了这样的事情:
class MainController: UIViewController, NSFetchedResultsController {
var activeTableView: UITableView?
}
在孩子身上:
class SecdController: MainController {
@IBOutlet weak var tableView: UITableView!
override var activeTableView: UITableView? {
get {return tableView}
set {}
}
}
下面是我要称为三个控制器的代码。
extension SomeController: NSFetchedResultsControllerDelegate {
func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
switch type {
case .insert:
tableView.insertRows(at: [newIndexPath!], with: .top)
break
case .delete:
tableView.deleteRows(at: [indexPath!], with: .fade)
break
case .update:
tableView.reloadRows(at: [indexPath!], with: .top)
case .move:
tableView.reloadRows(at: [indexPath!], with: .top)
default:
fatalError("feature not yet implemented")
}
}
func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange sectionInfo: NSFetchedResultsSectionInfo, atSectionIndex sectionIndex: Int, for type: NSFetchedResultsChangeType) {
let indexSet = IndexSet(integer: sectionIndex)
switch type {
case .insert:
tableView.insertSections(indexSet, with: .top)
case .delete:
tableView.deleteSections(indexSet, with: .top)
case .update, .move:
fatalError("Invalid change.")
default:
fatalError("feature not yet implemented")
}
}
func controllerWillChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
tableView.beginUpdates()
}
func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
tableView.endUpdates()
}
}
提前致谢:)
【问题讨论】:
标签: ios swift inheritance core-data nsfetchedresultscontroller