使用swift和fetchedResultsController在UITableView中重新排序单元格

时间:2014-12-15 22:38:57

标签: ios uitableview swift

我在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表示的实际索引路径。

所以我想我的问题变成:是否有一个函数可以编辑我插入的对象的索引路径,或者在特定的索引路径中添加对象?

0 个答案:

没有答案