Полноэкранный просмотр таблицы iPad-only app. Я включил удаление удаленных строк в своих строках. Анимация строк всегда заканчивается после удаления (commitEditingStyle завершает), но изредка просматривается весь вид таблицы. Не весь пользовательский интерфейс, заметьте, так что это не заблокированный основной поток. Я могу нажать заголовок столбца или нажать кнопку «Назад» на навигационном контроллере, но сама таблица блокируется и не может быть пропущена. Я могу разморозить его довольно просто, нажав одну из моих кнопок заголовка столбца.UITableView замерзает после прокрутки, чтобы удалить, но не весь пользовательский интерфейс
Я просто в полном недоумении для того, что может быть причиной замораживания. Я использую NSFetchedResultsController, и вот для этого мой код делегата. Это довольно плита котла (Update: не в качестве котельного листового металла в настоящее время, используя дозирующий подход.):
// MARK: NSFetchedResultsController delegate methods
lazy var deletedSectionIndexes : NSMutableIndexSet = {
return NSMutableIndexSet()
}()
lazy var insertedSectionIndexes : NSMutableIndexSet = {
return NSMutableIndexSet()
}()
lazy var deletedRowIndexPaths : [NSIndexPath] = {
return [NSIndexPath]()
}()
lazy var insertedRowIndexPaths : [NSIndexPath] = {
return [NSIndexPath]()
}()
lazy var updatedRowIndexPaths : [NSIndexPath] = {
return [NSIndexPath]()
}()
func controllerWillChangeContent(controller: NSFetchedResultsController) {
}
func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) {
switch(type) {
case .Delete:
if let indexPath = indexPath {
self.deletedRowIndexPaths.appendDistinct(indexPath)
}
case .Update:
if let indexPath = indexPath {
self.updatedRowIndexPaths.appendDistinct(indexPath)
}
case .Insert:
if let newIndexPath = newIndexPath {
self.insertedRowIndexPaths.appendDistinct(newIndexPath)
}
case .Move:
if let indexPath = indexPath, newIndexPath = newIndexPath {
self.insertedRowIndexPaths.appendDistinct(newIndexPath)
self.deletedRowIndexPaths.appendDistinct(indexPath)
}
}
}
func controller(controller: NSFetchedResultsController, didChangeSection sectionInfo: NSFetchedResultsSectionInfo, atIndex sectionIndex: Int, forChangeType type: NSFetchedResultsChangeType) {
switch(type) {
case .Delete:
self.deletedSectionIndexes.addIndex(sectionIndex)
case .Insert:
self.insertedSectionIndexes.addIndex(sectionIndex)
default:
break
}
}
func controllerDidChangeContent(controller: NSFetchedResultsController) {
self.tableView.beginUpdates()
self.tableView.insertSections(self.insertedSectionIndexes, withRowAnimation: .None)
self.tableView.deleteSections(self.deletedSectionIndexes, withRowAnimation: .None)
self.tableView.insertRowsAtIndexPaths(self.insertedRowIndexPaths, withRowAnimation: .None)
self.tableView.deleteRowsAtIndexPaths(self.deletedRowIndexPaths, withRowAnimation: .None)
self.tableView.reloadRowsAtIndexPaths(self.updatedRowIndexPaths, withRowAnimation: .None)
self.tableView.endUpdates()
self.insertedSectionIndexes.removeAllIndexes()
self.deletedSectionIndexes.removeAllIndexes()
self.deletedRowIndexPaths.removeAll()
self.insertedRowIndexPaths.removeAll()
self.updatedRowIndexPaths.removeAll()
}
Функция удаления вызывается в методе делегата didChangeObject, однако, технически это не реальное удаление. Я просто устанавливаю свойство -1, а затем сохраняю этот элемент через NSMangagedObjectContext - в этот момент NSFRC, кажется, делает правильные вещи, которые удаляют его из списка извлеченных объектов, которые были извлечены с использованием этого предиката:
NSPredicate(format: "account = %@ and quantity != -1", account)
, где account
- действительный объект, управляемый учетной записью. Строка исчезает без проблемы 90% или более времени. Иногда случается, что после завершения анимации таблица замораживается в усадьбе, которую я описал. Он никогда не зависает, пока кнопка удаления все еще отображается, поэтому я знаю, что это происходит после вызова commitEditingStyle. Кнопка удаления не имеет настраиваемой реализации. Это удаленная реализация UITableView по умолчанию для удаления. Вот мой commitEditingStyle метод:
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
if editingStyle == .Delete {
if let frameboardItem = self.fetchedResultsController.objectAtIndexPath(indexPath) as? IRMFrameBoardItemMO {
if frameboardItem.isNew {
// If it's never been pushed to the server, just delete locally. This will trigger a table reload
// via NSFetchedResultsController
DataManager.mainContext.deleteObject(frameboardItem)
} else {
// Otherwise mark it with a negative quantity which tells the server to delete it and tells the
// app to hide it.
frameboardItem.quantity = -1
}
do {
try DataManager.mainContext.save()
} catch let error as NSError {
dLog("Something went wrong: \(error.localizedDescription)")
}
}
}
}
Вы можете посмотреть видео здесь, о чем я говорю. Это более двух минут, поэтому вы можете не захотеть посмотреть все это, но я приведу его здесь для справки.
Хотелось бы услышать какие-либо предложения.
Update
Я обновил методы делегата NSFRC использовать дозирующий подход для обеспечения обновления получить применяется сразу. Это не решило проблему. Стол периодически замерзает.
Вы уверены, что источник данных обновляется правильно? Есть ли когда-либо ситуация, когда 'frameboardItem' является' nil' в следующем выражении: 'if let frameboardItem = self.fetchedResultsController.objectAtIndexPath (indexPath) как? IRMFrameBoardItemMO'? И если это «nil», обновляется ли таблица без обновления источника данных? – Alexander
Я смотрел видео несколько раз, где вы удалялись, и это зависало. это похоже на то, когда вы удаляете верх и низ из одного раздела, а затем меняете разделы. и удалите верх и низ. Или, может быть, это всего лишь один или два отдельных раздела. Это заставляет меня задаться вопросом, есть ли проблемы с подсчетом списка или как они перемещаются. это удерживает пользовательский интерфейс таблицы. Было бы хорошо, если бы вы могли сузить его до точности его воспроизводимости. Просто вслух. –
1) Является ли tableView в контроллере дочернего представления? 2) Если в целях тестирования вы меняете одну из кнопок (которая реагирует на касания), так что она вызывает прокрутку телевизора вверх (или снизу), действительно ли она прокручивается? Это может дать представление о том, является ли телевизор просто игнорированием прикосновений или замерзает при попытке прокрутки. – pbasdf