2015-10-08 3 views
4

Моя UITableView прокручивается, как только я добавляю новый комментарий к CoreData. NSFetchedResultsController знает об этом, помещает этот комментарий в нижней части таблицы и прокручивает таблицу вверх. Это нормально?Как предотвратить прокрутку UITableView, когда NSFetchedResultsController добавляет новую запись?

Мой пример:

Просто, прежде чем я добавить комментарий

enter image description here

Только после того, как я добавить комментарий (не ожидаемое поведение):

enter image description here

Он должен быть таким же (после того, как я проведу его вручную вручную):

enter image description here

Это может быть связано с следующей ситуацией:

  1. Это своего рода дескриптор моего NSFetchedResultsController:

    NSSortDescriptor(key: "createdAt", ascending: false) //from the latest to the oldest 
    
  2. Но мне нужно, чтобы отобразить мои комментарии для обратных указательных путей (последние находятся в самом низу). Другими словами, везде, когда мне нужно использовать indexPath я использую:

    private func reversedIndexPathForIndexPath(indexPath: NSIndexPath) -> NSIndexPath { 
        return NSIndexPath(forRow: fetchedResultsController.fetchedObjects!.count - indexPath.row - 1, inSection: 0) 
    } 
    

NSFetchedResultsControllerDelegate:

//MARK: - NSFetchedResultsControllerDelegate 

func controllerWillChangeContent(controller: NSFetchedResultsController) { 
    self.tableView.beginUpdates() 
} 

func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) { 

    switch type { 
    case .Insert: 
     if let newIndexPath = newIndexPath { 
      tableView.insertRowsAtIndexPaths([reversedIndexPathForIndexPath(newIndexPath)], withRowAnimation: .Fade) 
     } 
    case .Delete: 
     if let indexPath = indexPath { 
      tableView.deleteRowsAtIndexPaths([reversedIndexPathForIndexPath(indexPath)], withRowAnimation: .Fade) 
     } 
    case .Update: 
     if let indexPath = indexPath { 
      tableView.reloadRowsAtIndexPaths([reversedIndexPathForIndexPath(indexPath)], withRowAnimation: .Fade) 
     } 
    case .Move: 
     if let indexPath = indexPath, let newIndexPath = newIndexPath { 
      tableView.deleteRowsAtIndexPaths([reversedIndexPathForIndexPath(indexPath)], withRowAnimation: .Fade) 
      tableView.insertRowsAtIndexPaths([reversedIndexPathForIndexPath(newIndexPath)], withRowAnimation: .Fade) 
     } 
    } 
} 

func controllerDidChangeContent(controller: NSFetchedResultsController) { 
    tableView.endUpdates() 
} 

ли это связано с моей проблемой?

+0

просто отключить Tableview перед добавлением новой записи –

+0

@PiyushPatel 'self.tableView. scrollEnabled = false', все еще перемещается в начало –

+0

Использование: tableView.alwaysBounceVertical = NO. –

ответ

6

Edited Ответ:

Я был в состоянии воспроизвести этот глюк со следующими шагами:

  1. UITableView с rowHeight набор к UITableViewAutomaticDimension и ненулевым estimatedRowHeight.
  2. Таблица прокручивается до самого низа, с последней ячейкой, полностью видимой на нижнем крае.
  3. Вставка новой ячейки ниже последней приводит к визуальному сдвигу ячеек на несколько точек вниз (в моей настройке она отличается от 5 до 40).

Источником такого поведения является дополнительное расследование.

На данный момент единственным решением является не использование UITableViewAutomaticDimension и возврат высоты строки от tableView:heightForRowAtIndexPath:.

Кстати, реализация инвертированных указательных путей имеет один значительный недостаток. Когда FRC вызывает метод делегирования controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:, все пути указателей удаления относятся к набору данных перед изменением, а все пути указателей вставки - для последующей замены.Когда вы находитесь между ними controllerWillChangeContent: и controllerDidChangeContent:, fetchedResultsController.fetchedObjects будет содержать набор данных после изменения, я полагаю (нужно проверить, хотя).

+0

Нет, это не может быть так. Этот способ будет работать, только если я хочу отображать ВСЕ сообщения. Что делать, если мне нужно отображать только 10 последних сообщений? –

+0

А, 'fetchLimit'? – bteapot

+0

да, точно ... –

2

Я нашел что-то, что сработало для меня. я столкнулся с той же проблемой, и мой estimatedRowHeight было 33 и все мои клетки больше, чем 33.

Я только что изменил мою estimatedRowHeight моей максимальной высоты ячейки (или больше, чем максимальная высота ячейки)

self.table.estimatedRowHeight = 310 
    self.table.rowHeight = UITableViewAutomaticDimension 

работал как шарм, все клетки теперь и UITableView автоматического изменения не прокрутки сверху или снизу, когда основные данные выполняет обновление/удаление/вставка прокруткой