Не могу удалить строку в разделе

у меня проблема с удалением ячеек в разделе. TableViewController имеет три раздела с различными ячейками. Если я попытаюсь удалить одну ячейку, отладчик покажет:

И я просто не понимаю...

Вот мой код:

Может кто-нибудь помочь мне?

override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {

    var indexes: NSMutableIndexSet = NSMutableIndexSet()
    dataTestType = context.executeFetchRequest(fetchRequestForTestType, error: nil) as [TestType]

    if editingStyle == UITableViewCellEditingStyle.Delete {

        context.deleteObject(dataTestType[indexPath.row] as NSManagedObject)
        context.save(nil)
        dataTestType.removeAtIndex(indexPath.row)

        if dataTestType.count == 0 {
            indexes.addIndex(indexPath.section)
        }

        tableView.beginUpdates()
        tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
        tableView.deleteSections(indexes, withRowAnimation: .Fade)
        tableView.endUpdates()
    }
}

Большое спасибо!

Вы удаляете объект в

override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {

    var indexes: NSMutableIndexSet = NSMutableIndexSet()
    dataTestType = context.executeFetchRequest(fetchRequestForTestType, error: nil) as [TestType]

    if editingStyle == UITableViewCellEditingStyle.Delete {

        context.deleteObject(dataTestType[indexPath.row] as NSManagedObject)
        context.save(nil)
        dataTestType.removeAtIndex(indexPath.row)

        if dataTestType.count == 0 {
            indexes.addIndex(indexPath.section)
        }

        tableView.beginUpdates()
        tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
        tableView.deleteSections(indexes, withRowAnimation: .Fade)
        tableView.endUpdates()
    }
}
из массива _2_


person Tom Kuschka    schedule 21.01.2015    source источник
comment
эта строка внутри функции commitEditingStyle: context.deleteObject(dataTestType[indexPath.row] as NSManagedObject)   -  person matt    schedule 21.01.2015
comment
Вы знаете, что это не то, как вы удаляете с помощью Core Data, верно? Вы должны удалить из контекста управляемого объекта, сохранить и остановить. Затем вас вызывают обратно в методах NSFetchedResultsControllerDelegate, и именно здесь вы обновляете пользовательский интерфейс.   -  person Tom Kuschka    schedule 21.01.2015
comment
попробуйте сделать вызов в следующем порядке: context.deleteObject(dataTestType[indexPath.row] as NSManagedObject) dataTestType.removeAtIndex(indexPath.row)   -  person matt    schedule 22.01.2015
comment
Затем я получил еще одну ошибку. Я обновлю свой вопрос!   -  person sazz    schedule 22.01.2015


Ответы (1)


А в следующей строке вы пытаетесь получить объект по тому же индексу, но его не будет, если вы удалите единственный объект в массиве:

 dataTestType.removeAtIndex(indexPath.row)

Вы можете просто решить проблему, изменив порядок этих двух строк.

context.deleteObject(dataTestType[indexPath.row] as NSManagedObject)

Как отметил Мэтт, вы также можете использовать NSFetchedResultsController, так как это рекомендуется для отображения записей Core Data в UITableView. Тогда вам вообще не понадобится массив dataTestType. Теперь вы вызываете context.executeFetchRequest каждый раз, когда вызывается метод commitEditingStyle. Это неэффективно и может привести к снижению производительности, если вам нужно извлечь много записей.

Какая именно строка кода вызывает сбой?

person Michał Ciuba    schedule 21.01.2015
comment
Эта ошибка означает, что после удаления объекта вы по-прежнему возвращаете 1 из метода tableView:numberOfRowsInSection: в вашем источнике данных. Можем ли мы увидеть реализацию этого метода? Также, если у вас много разделов, вам может потребоваться удалить раздел, если он не содержит строк, см. этот ответ: stackoverflow.com/a/1001239 /2128900 - person Tom Kuschka; 22.01.2015
comment
Вы пробовали решение, предложенное в моем предыдущем комментарии? Кажется, вы удалили раздел, когда удалили последнюю строку в этом разделе. - person Michał Ciuba; 22.01.2015
comment
Хорошо, я попробовал, но появилась новая ошибка... Я снова обновлю свой пост. - person Michał Ciuba; 22.01.2015
comment
Вы также должны изменить метод _1_, чтобы он возвращал правильное значение после удаления раздела. - person Tom Kuschka; 23.01.2015
comment
Хорошо, это не работает, но я не хочу удалять весь раздел. Просто ячейка должна быть удалена пользователем. Разделы исправлены! - person Michał Ciuba; 23.01.2015
comment
Как я упоминал ранее, если вы удалите все ячейки в разделе, вы должны удалить этот раздел (если только он не является единственным оставшимся разделом). В противном случае вы получите сбои. - person Tom Kuschka; 27.01.2015
comment
2015-01-23 20:22:15.105 Оценка - Zensurenverwaltung[23854:5674475] * Ошибка утверждения в -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit_Sim/UIKit-3318.16.14/UITableView.m:1566 2015- 01-23 20:22:15.133 Оценка — Zensurenverwaltung[23854:5674475] * Завершение работы приложения из-за неперехваченного исключения «NSInternalInconsistencyException», причина: «Недопустимое обновление: недопустимое количество разделов. Количество разделов, содержащихся в табличном представлении после обновления (3), должно быть равно количеству разделов, содержащихся в табличном представлении до обновления (3), плюс или минус количество вставленных или удаленных разделов (0 вставленных, 1 удален).' *** Стек первого броска. : объект: файл: LineNumber: описание: 195] + 4 UIKit 0x00000001013c98ff - [UITableView _endCellAnimationsWithContext: 10935] + 5 класс - Zensurenverwaltung 0x00000001000fa0c2 _TFC26Grade___Zensurenverwaltung28TestTypesTableViewController9tableViewfS0_FTCSo11UITableView18commitEditingStyleOSC27UITableViewCellEditingStyle17forRowAtIndexPathCSo11NSIndexPath_T_ + 3618 6 класс - Zensurenverwaltung 0x00000001000fa207 _TToFC26Grade___Zensurenverwaltung28TestTypesTableViewController9tableViewfS 0_FTCSo11UITableView18commitEditingStyleOSC27UITableViewCellEditingStyle17forRowAtIndexPathCSo11NSIndexPath_T_ + 87 7 UIKit 0x00000001013edcb4 - [UITableView animateDeletionOfRowWithCell:] + 130 8 UIKit 0x00000001013ce125 __52- [UITableView _swipeActionButtonsForRowAtIndexPath:] _ block_invoke + 72 9 UIKit 0x00000001012f68be - [UIApplication sendAction: до: от: forEvent:] + 75 10 UIKit 0x00000001013fd410 - [UIControl _sendctctsforewents: osevent:] + 467 11 Uikit 0x00000001013FC7DF - [UICONTROL TACKSEDED: CONEVENT:] + 522 12 Uikit 0x00000001016A3540 _UigesturecurecognizerUpdate + 9487 13 Uikit 0x000000010133BFF6 - [uiwindow _sendsestureForevert:] + 1041 14 Uikit 0x000000010133CC23 - [Uiwindow Sende выход:] + 667 15 UIKit 0x00000001013099b1 - [UIApplication SendEvent:] + 246 16 UIKit 0x0000000101316a7d _UIApplicationHandleEventFromQueueEvent + 17370 17 UIKit 0x00000001012f2103 _UIApplicationHandleEventQueue + одна тысяча девятьсот шестьдесят один 18 CoreFoundation 0x00000001007f4551 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION + 17 19 CoreFoundation 0x00000001007ea41d __CFRunLoopDoSources0 + 269 20 CoreFoundation 0x00000001007e9a54 __CFRunLoopRun + 868 21 Corefoundation 0x00000001007E9486 Cfrunlooprunspecific + 470 22 Графические сервисы 0x00000001052FD9F0 GSEVENTRUNModal + 161 23 Uikit 0x00000001012F5420 UIAPlicationMain + 1282 24 класс - Zensurenvalwaltung 0x00000001001E164E Top_level_Code + 78 25 класс - Zensurenverwaltung 0x00000001001e168a main + 42 26 libdyld.dylib 0x0000000102d87145 start + 1 27 ? ?? 0x0000000000000001 0x0 + 1 ) libc++abi.dylib: завершение с необработанным исключением типа NSException - person Michał Ciuba; 27.01.2015