2015-09-13 3 views
1

Я модернизировал мое приложение Swift 2.0 и с тех пор NSFetchedResultsController не правильно вести себя на прошивке 8.4 (в прошивке 9 работает как ожидался)NSFetchedResultsController не обновляю таблица

Сценария: - новое юридическое лицо добавил - Row появится в Tableview - Собственность субъекта изменяется, поэтому он не должен совпадать предикат fetchedtesultscontroller - строка не исчезает из Tableview ...

Я могу видеть beginUpdates , doChangeObject вызывается с типом Delete, и вызывается endUpdates(). Мой кеш ноль.

Это известная ошибка в xCode 7 с iOS 8.4? (забавно, что иногда это работает, но большую часть времени это не так, и это очень важно для моего приложения ...)

Заранее спасибо!

p.s. Я попытался, если (! IndexPath = newIndexPath) вещи они говорят в Интернете, но один и тот же результат ...

ответ

3

Для любого, имеющего ту же проблему, вот решение:

в вашем:

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

Убедитесь, что дело Обновление до дела вставки ... так что вместо этого:

func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) { 
      switch type { 
      case .Insert: 
       self.tableView.insertRowsAtIndexPaths([newIndexPath!], withRowAnimation: UITableViewRowAnimation.Fade); 
      case .Move: 
       if(!indexPath!.isEqual(newIndexPath!)) { 
        self.tableView.moveRowAtIndexPath(indexPath!, toIndexPath: newIndexPath!); 
       } 
      case .Update: 
       let cell = self.tableView.cellForRowAtIndexPath(indexPath!) as! UITableViewCell; 
       self.configureCell(cell, atIndexPath: indexPath!); 
       self.tableView.reloadRowsAtIndexPaths([indexPath!], withRowAnimation: UITableViewRowAnimation.Fade); 
      case .Delete: 
       self.tableView.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: UITableViewRowAnimation.Fade) 
      } 
     } 

вы должны иметь это:

func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) { 
     switch type { 
     case .Update: 
      let cell = self.tableView.cellForRowAtIndexPath(indexPath!) as! UITableViewCell; 
      self.configureCell(cell, atIndexPath: indexPath!); 
      self.tableView.reloadRowsAtIndexPaths([indexPath!], withRowAnimation: UITableViewRowAnimation.Fade); 
     case .Insert: 
      self.tableView.insertRowsAtIndexPaths([newIndexPath!], withRowAnimation: UITableViewRowAnimation.Fade); 
     case .Move: 
      if(!indexPath!.isEqual(newIndexPath!)) { 
       self.tableView.moveRowAtIndexPath(indexPath!, toIndexPath: newIndexPath!); 
      } 
     case .Delete: 
      self.tableView.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: UITableViewRowAnimation.Fade) 
     } 
    } 

Это дало мне головную боль, но, наконец, нашли решение ...

+1

Вам нужны перерывы, иначе операторы случае провалятся и все будут выполнены. Не могу поверить, что это принятый ответ. – Matthijs

+1

Swift (3) не нуждается в 'break'. Случаи никогда не проваливаются. Порядок не важен. – Matt

1

Похоже IOS 8 ошибка, и вы можете найти более подробную информацию здесь: https://forums.developer.apple.com/thread/11662#65178

Если вы хотите, чтобы исправить это, попробуйте это код:

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

    switch type { 
    case NSFetchedResultsChangeType(rawValue: 0)!: 
     break // iOS 8 bug - Do nothing if we get an invalid change type. 
    case .Insert: 
     // Insert here 
     break 
    case .Delete: 
     // Delete here 
     break 
    case .Move: 
     // Move here 
     break 
    case .Update: 
     // Update here 
     break 
    } 
} 
0

для моего случая, я должен был сделать это вместо:

case .Update: 

к

case NSFetchedResultsChangeType(rawValue: 3)!: 

Для didChangeObject:

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

    switch type { 
    case .Insert: 
     print("didChangeObject.Insert") 
     tableView.insertRowsAtIndexPaths([newIndexPath!], withRowAnimation: .Fade) 
    case .Delete: 
     print("didChangeObject.Delete") 
     tableView.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: .Fade) 
    case NSFetchedResultsChangeType(rawValue: 3)!: 
     print("didChangeObject.Update") 
     self.configureCell(tableView.cellForRowAtIndexPath(indexPath!)!, withObject: anObject as! NSManagedObject) 
    case .Move: 
     tableView.moveRowAtIndexPath(indexPath!, toIndexPath: newIndexPath!) 
    default: 
     return 
    } 
} 
Смежные вопросы