0

У меня есть две таблицы в отдельных представлениях, в каждом списке таблицы есть отдельный объект в CoreData. Пользователь может нажать кнопку в любой ячейке, чтобы переместить ее в другой список. Это работает, элементы можно перемещать одним нажатием, все сохраняется и сохраняется после закрытия приложения.Объект CoreData, вставленный по видимой случайной позиции в списке

Проблема

В настоящее время код должен пересчитать элементы в списке адресатов, а затем добавить элемент перемещается к концу своего нового списка. Этого не происходит. Вместо этого элемент вводится произвольно (не в конце или в начале). Однако, как только он вставлен, любые дальнейшие перемещения элементов будут находиться под ним. Я попытался заменить функцию count на 1, потому что я действительно хочу, чтобы перемещенный элемент отображался наверху в любом случае, но это не помогает.

Код

Во-первых, вот код viewDidLoad, который запускает загрузку основной список каждый раз, когда появляется главный вид:

override func viewDidLoad() { 
    super.viewDidLoad() 

    currentListEntity = curList 

    //Load the list from Core Data 
    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
    let managedContext = appDelegate.managedObjectContext! 
    let fetchRequest = NSFetchRequest(entityName: currentListEntity) 
    let sortDescriptor = NSSortDescriptor(key: "displayOrder", ascending: true) 
    fetchRequest.sortDescriptors = [ sortDescriptor ] 
    var error: NSError? 
    let fetchedResults = managedContext.executeFetchRequest(fetchRequest, error: &error) as? [NSManagedObject] 


    if let results = fetchedResults { 
     taskList_Cntxt = results 
    } else { 
     println("Could not fetch \(error), \(error!.userInfo)") 
    } 
} 

Функция, которую я хотел бы ожидать, чтобы добавить перемещенный объект в конец нового списка (который является параметром сущности), но вместо этого вставляет его среди других элементов списка:

func addToList (sender: AnyObject, entity: String) { 
    //Setup CoreData context 
    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
    let managedContext = appDelegate.managedObjectContext! 

    let entity = NSEntityDescription.entityForName(entity, inManagedObjectContext: managedContext) 
    let task = NSManagedObject(entity: entity!, insertIntoManagedObjectContext:managedContext) 

    //Figure out the cell pressed 
    let button = sender as! UIButton 
    let contentView = button.superview! 
    let cell = contentView.superview as! CustomTableViewCell_F2 

    //Set cell contents to variables 
    var nameValue = cell.nameLabel!.text 
    var descValue = cell.descLabel!.text 

    //Set content variables to NSObject called "task" 
    task.setValue(nameValue, forKey: "name") 
    task.setValue(descValue, forKey: "desc") 

    //Error check 
    var error: NSError? 
    if !managedContext.save(&error) { 
     println("Could not save \(error), \(error?.userInfo)") 
    } 
    //Get count, append to end, sort, save 
    var insertAt = taskList_Cntxt.count 
    addTask(task, displayOrder: insertAt) 
    updateDisplayOrder() 
    managedContext.save(nil) 
} 
//Referenced by larger add-task function 
func addTask(task: NSManagedObject, displayOrder: Int) { 
    taskList_Cntxt.insert(task, atIndex: displayOrder) 
    updateDisplayOrder() 
} 

//Called to update Core Data after append, delete, and drag/drop 
func updateDisplayOrder() { 
    for i in 0..<taskList_Cntxt.count { 
     let task = taskList_Cntxt[i] 
     task.setValue(i, forKey: "displayOrder") 
    } 
} 

Любые идеи о том, как это исправить? Идеально добавить в верхнюю часть списка, но в этот момент добавить его к нижней части тоже было бы здорово.

+0

Кажется, что вы добавляете задачу в список в вашей функции 'addTask', которую вы не указали. Также 'updateDisplayOrder' уверен, похоже, что это повлияет на порядок отображения, но это тоже не включено. Оба они почти наверняка имеют решающее значение для правильного упорядочения заказа. –

+0

@TomHarrington Извините, что отправил это после того, как вы продержались большую часть ночи, пытаясь решить эту и еще одну проблему, очевидно, необходимый сон! Я включил обе функции –

ответ

0

Я в конце концов понял это!

Перед тем, как, когда я использовал приложение и просмотрев список, и нажал 'move to x list' для элемента, элемент будет добавлен в список адресатов где-то посередине.

исправление, добавление задания из одного списка в другой отлично работает, когда я загружаю список адресатов, элемент, который я отправил, всегда сидит прямо сверху.

Решение

Если вы посмотрите на мой код, что я на самом деле делать было дать неправильный адрес вставки. Ошибка была в двух местах.

Ошибка 1

я получал счет старого списка и с помощью счетчика в моей вставки положение:

//Get count, append to end, sort, save 
var insertAt = taskList_Cntxt.count 
addTask(task, displayOrder: insertAt) 
updateDisplayOrder() 
managedContext.save(nil) 

Теперь я изменил способ, чтобы всегда вставлять в 1:

var insertAt = 1 
addTask(task, displayOrder: insertAt) 
update_TargetDisplayOrder() 
managedContext.save(nil) 

Ошибка 2

Когда я был перенумерации список, я обновив неверный список:

func updateDisplayOrder() { 
    for i in 0..<taskList_Cntxt.count { 
     let task = taskList_Cntxt[i] 
     task.setValue(i, forKey: "displayOrder") 
} 

Теперь я пытаюсь добавить функцию метод обновления, который смотрит на целевой список, а не список источников:

func update_TargetDisplayOrder() { 
    for i in 0..<targetList_Cntxt.count { 
     let task = targetList_Cntxt[i] 
     task.setValue(i, forKey: "displayOrder") 
    } 
} 

Для того, чтобы сделать это, мне нужно, чтобы добавить вторая переменная контекста. Добавление targetList_Cntxt позволило мне изменить порядок нового списка вместо старого. После того, как я это сделал, все сработало.

Примечание:

После выполнения функции добавить, элемент удаляется из старого списка:

func codeForDelete(sender: AnyObject) { 
    //Figure out the cell pressed 
    let cell = sender as! CustomTableViewCell 
    let indexPath = tableView.indexPathForCell(cell) 

    //Setup variables for CoreData delete methods 
    let appDel: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
    let context: NSManagedObjectContext = appDel.managedObjectContext! 

    //Remove the deleted item from the model 
    context.deleteObject(taskList_Cntxt[indexPath!.row] as NSManagedObject) 
    taskList_Cntxt.removeAtIndex(indexPath!.row) 
    context.save(nil) 

    viewDidLoad() 
    println("Delete task function ran") 
} 

Но, как я пишу это, я понимая, что я уезжаю из функции обновления порядок сортировки старого списка после удаления. Это то, что мне нужно исправить!