ios – 如何在swift中使用fetchedresultscontroller重新排序tableview行?

ios – 如何在swift中使用fetchedresultscontroller重新排序tableview行?,第1张

概述我正在尝试使用核心数据和nsfetchresultscontroller重新排序表视图中的单元格.我找到了一些方法,使用目标C(其中我什么都不知道)这样做,并尝试在 swift中实现它们,这是我想出的: var books: Array<AnyObject> = []// Override to support rearranging the table view.override func 我正在尝试使用核心数据和nsfetchresultscontroller重新排序表视图中的单元格.我找到了一些方法,使用目标C(其中我什么都不知道)这样做,并尝试在 swift中实现它们,这是我想出的:

var books: Array<AnyObject> = []// OverrIDe to support rearranging the table vIEw.overrIDe func tableVIEw(tableVIEw: UItableVIEw,moveRowAtIndexPath fromIndexPath: NSIndexPath,toIndexPath: NSIndexPath) {    books = fetchedResultsController.fetchedobjects!    let book = fetchedResultsController.objectAtIndexPath(fromIndexPath)    self.fetchedResultsController.delegate = nil    books.removeAtIndex(fromIndexPath.row)    books.insert(book,atIndex: toIndexPath.row)    var i = 0    for book in books {        book.setValue(i++,forKey: "position")    }    try! context.save()    self.fetchedResultsController.delegate = self}

委托和上下文引用位于另一个文件的扩展中.
使用此代码有时它可以工作,有时它不会.我改变了顺序,再次运行应用程序,这是一个完全不同的顺序,我无法弄清楚.特别是当我一次移动多行时.如果我将每个对象的“位置”属性打印到控制台,我可以看到它们确实没有正确更新.但为什么不呢?

我究竟做错了什么?什么是更好的选择?

提前致谢,

丹尼尔

编辑:

好的,这是工作代码:

func initializefetchedResultsController() {    let request = NSFetchRequest(entityname: "Book")    let sortDescriptor = NSSortDescriptor(key: "position",ascending: true)    request.sortDescriptors = [sortDescriptor]    self.fetchedResultsController = NSFetchedResultsController(fetchRequest: request,managedobjectContext: context,sectionnameKeyPath: nil,cachename: nil)    self.fetchedResultsController.delegate = self    do {        try self.fetchedResultsController.performFetch()    } catch {        fatalError("Failed to initialize FetchedResultsController: \(error)")    }}// OverrIDe to support rearranging the table vIEw.overrIDe func tableVIEw(tableVIEw: UItableVIEw,toIndexPath: NSIndexPath) {    initializefetchedResultsController()    var objects = self.fetchedResultsController.fetchedobjects! as! [ObjectClass]    self.fetchedResultsController.delegate = nil    let object = objects[fromIndexPath.row]    objects.removeAtIndex(fromIndexPath.row)    objects.insert(object,atIndex: toIndexPath.row)    var i = 0    for object in objects {        object.position = i++    }    try! context.save()    self.fetchedResultsController.delegate = self}

诀窍是initializefetchedResultsController函数,除了在vIEwDIDLoad,我有它,必须在moveRowAtIndexPath位内重复.此外,初始化函数和数组声明必须在将FRC委托设置为nil之前(显然,但很容易错过).

解决方法 你不应该编辑书籍,它不属于你,而且实际上是私人数据.相反,您应该只更新正在移动的对象以更改位置值.如果使用当前逻辑中的数组重新排序来执行此操作,则应创建FRC提供的阵列的新可变副本.您还应该将位置的新值设置为NSNumber实例. 总结

以上是内存溢出为你收集整理的ios – 如何在swift中使用fetchedresultscontroller重新排序tableview行?全部内容,希望文章能够帮你解决ios – 如何在swift中使用fetchedresultscontroller重新排序tableview行?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:http://outofmemory.cn/web/1048035.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-25
下一篇2022-05-25

发表评论

登录后才能评论

评论列表(0条)

    保存