我在swift中有一个UITableView,其中应用程序允许用户重新排序单元格,但在重新排序期间它会一直崩溃。
我有这个数据模型:
class Person: NSManagedObject {
@NSManaged var name: String
@NSManaged var mood: String
}
我设置了一个bool变量来检查用户何时点击编辑按钮以查看tableview.setEditit是否设置为true,因为这表示订单的更改即将发生:
var userDrivenDataChange : Bool = false
然后,对于每个获取的结果控制器委托方法,在我继续之前,我总是检查对象是否存在用户驱动的更改 - 例如......
func controllerWillChangeContent(controller: NSFetchedResultsController) {
if userDrivenDataChange{
return
}
tblView.beginUpdates()
}
现在,这是我真正挣扎的......
在moveRowAtIndexPath函数中,我的逻辑是获取用户刚刚移动的对象,然后获取用户想要将该行移动到的部分。然后创建一个新的Person NSManagedObject,但将其“mood”字段设置为新的section name,然后删除旧indexPath上的对象。
func tableView(tableView: UITableView, moveRowAtIndexPath sourceIndexPath: NSIndexPath, toIndexPath destinationIndexPath: NSIndexPath) {
userDrivenDataChange = true
var context = (UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext!
var entity = NSEntityDescription.entityForName("Person", inManagedObjectContext: context)
var secInfo = fetchedResultController.sections![destinationIndexPath.section] as NSFetchedResultsSectionInfo
var personToAmend = fetchedResultController.objectAtIndexPath(sourceIndexPath) as Person
var copyOfPerson = Person(entity: entity!, insertIntoManagedObjectContext: context)
copyOfPerson.name = personToAmend.name
copyOfPerson.mood = secInfo.name!
context.deleteObject(personToAmend)
var err : NSError?
if !context.save(&err){
println(err)
}
userDrivenDataChange = false
}
所以这不起作用,老实说不清楚为什么!
非常感谢任何帮助!
谢谢, 杰米
P.S。只是因为你需要看到它,我的结果控制器是:
lazy var fetchedResultController : NSFetchedResultsController = {
let fetchRequest = NSFetchRequest(entityName: "Person")
let context = (UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext!
let sort = NSSortDescriptor(key: "mood", ascending: true)
fetchRequest.sortDescriptors = [sort]
let frc = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: "mood", cacheName: nil)
frc.delegate = self
return frc
}()
----编辑:
当用户将行从一个部分重新排序到另一个部分时,fetchedResultsController总是将该行添加到该部分的开头而不是destinationIndexPath表示的实际索引路径。
所以我想我的问题变成:是否有一个函数可以编辑我插入的对象的索引路径,或者在特定的索引路径中添加对象?