ios - Swift: NSArrayM controllerWillChangeContent:]: 无法识别的选择器发送到实例

标签 ios swift nsfetchedresultscontroller

在我的 Controller 中,我有两个 UICollectionView 和两个不同的NSFetchedResultsControllers:

这就是我在 viewDidLoad: 中创建它的方式:

private func setupFetchedResultsControllers() {

    let currentStudent = BWSettings.sharedSettings.currentUser as! BWCoreDataStudent
    let context = NSManagedObjectContext.MR_defaultContext()

    let topFetchReguest = NSFetchRequest(entityName: "BWCoreDataWishlistBook")
    let positionDescriptor = NSSortDescriptor(key: "position", ascending: true)

    topFetchReguest.sortDescriptors = [positionDescriptor]

    topFetchedResultsController = NSFetchedResultsController(fetchRequest: topFetchReguest, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
    topFetchedResultsController.fetchRequest.predicate = NSPredicate(format: "student.id = %lld AND position != nil", currentStudent.id)
    topFetchedResultsController.delegate = BWStudentWishlistFetchedResultsControllerDelegate(collectionView: topCollectionView, studentWishlistContainerViewController: self)

    try! topFetchedResultsController.performFetch()

    let bottomFetchReguest = NSFetchRequest(entityName: "BWCoreDataWishlistBook")
    let addedAtDescriptor = NSSortDescriptor(key: "createdAt", ascending: true)

    bottomFetchReguest.sortDescriptors = [addedAtDescriptor]

    bottomFetchedResultsController = NSFetchedResultsController(fetchRequest: bottomFetchReguest, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
    bottomFetchedResultsController.fetchRequest.predicate = NSPredicate(format: "student.id = %lld AND position = nil", currentStudent.id)
    bottomFetchedResultsController.delegate = BWStudentWishlistFetchedResultsControllerDelegate(collectionView: bottomCollectionView, studentWishlistContainerViewController: self)

    try! bottomFetchedResultsController.performFetch()
}

这是我的自定义委托(delegate):

class BWStudentWishlistFetchedResultsControllerDelegate: NSObject, NSFetchedResultsControllerDelegate {

    private var collectionView: UICollectionView!
    private var collectionViewChanges = [[NSFetchedResultsChangeType: [NSIndexPath]]]()

    private weak var studentWishlistContainerViewController: BWStudentWishlistContainerViewController!

    init(collectionView: UICollectionView, studentWishlistContainerViewController: BWStudentWishlistContainerViewController) {

        self.collectionView = collectionView
        self.studentWishlistContainerViewController = studentWishlistContainerViewController
    }

    //MARK: - NSFetchedResultsControllerDelegate
    //here are my custom default methods
}

这是一条完整的错误信息:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayM controllerWillChangeContent:]: unrecognized selector sent to instance 0x14ec0d930'

为什么会这样?

最佳答案

您的错误是您的 NSFetchedResultsController 委托(delegate)正在解除分配。 而不是:

 topFetchedResultsController.delegate = BWStudentWishlistFetchedResultsControllerDelegate(collectionView: topCollectionView, studentWishlistContainerViewController: self)

您需要使用属性保留对委托(delegate)的引用:

var fetchDelegate = BWStudentWishlistFetchedResultsControllerDelegate(..)
...
topFetchedResultsController.delegate = self.fetchDelegate

按照您的方式,委托(delegate)将在 setupFetchedResultsControllers() 作用域结束时释放

关于ios - Swift: NSArrayM controllerWillChangeContent:]: 无法识别的选择器发送到实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37299617/

相关文章:

ios - 将 iPhone 模拟器重置为默认值?

ios - 如何配置图像或 ImageView ,以便无论 ImageView 的大小如何,图像都保持其纵横比?

Javascript 仅在 IOS 浏览器中返回 NaN

ios - NSLocationWhenInUseUsageDescription 警告,但我已经添加了它

ios - NSFetchedResultController 按多个键对 TableView 部分进行排序

ios - NSFetchedResultsController:需要文档澄清

swift - 界面转换后效果如何?

ios - 作为 Y 的子类的类型 X 的向下转换集

iphone - 在 Swift 中使用图像设置 map 注释

iphone - 具有两个 NSFetchedResultsController 实例的 TableView