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行?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)