2016-08-08 2 views
-1

У меня возникла проблема, когда после того, как я удалил строку tableview, строка не будет удалена, вот код, я прочитал учебник онлайн и успешно удалил из модели данных, но она не будет удалять удаленную строку, если я не откинусь назад на предыдущий экран и вернусь к этому представлению, почему это? :Строка UITableView не удаляется после удаления

func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool { 
    return true 
} 

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

    if (editingStyle == UITableViewCellEditingStyle.Delete) { 

     let product = frc.objectAtIndexPath(indexPath) as! Product 

     let productName = product.name 

     let message = (MCLocalization.sharedInstance.stringForKey("cart_remove_one_item_message", replacements: ["%s" : productName!])) 
     let alert = UIAlertController(title: (MCLocalization.sharedInstance.stringForKey("cart_remove_title")), message: message, preferredStyle: UIAlertControllerStyle.Alert) 

     let OKAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: { 
      (_)in 

      let managedObject : NSManagedObject = self.frc.objectAtIndexPath(indexPath) as! NSManagedObject 
      self.moc.deleteObject(managedObject) 
      self.tableView.reloadData() 

      do { 
       try self.moc.save() 
      } catch { 
       print("Failed to save.") 
       return 
      } 
     }) 

     alert.addAction(OKAction) 
     alert.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel, handler: nil)) 
     self.presentViewController(alert, animated: false, completion: nil) 
    } 
} 

ответ

0

Вам необходимо удалить объект из массива, а затем перезагрузить tableView после moc.save().

let managedObject : NSManagedObject = self.frc.objectAtIndexPath(indexPath) as! NSManagedObject 
self.moc.deleteObject(managedObject) 
do { 
    try self.moc.save() 

} catch { 
    print("Failed to save.") 
    return 
} 

Edit: Вам нужно добавить, что в вашем вопросе, который вы используете NSFetchedResultsController, сейчас я думаю, что вы установили делегат с self.frc.delegate = self, затем добавить этот метод делегата также удалить reloadData нет нужно для этого сейчас.

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

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

func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) { 
    switch type { 
    case .Insert: 
     tableView.insertRowsAtIndexPaths([newIndexPath!], withRowAnimation: .Automatic) 
    case .Delete: 
     tableView.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: .Automatic) 
    default: break 
    } 
} 

За дополнительной информацией о NSFetchedResultsController проверьте учебники, это поможет вам.

+0

это не ошибка "значение типа 'NSFetchResultsController' имеет никакого элемента 'удалить объект'." – bobo

+0

Отметьте отредактированный ответ :) –

+0

это работает, спасибо alot :) – bobo

2

Вы перегрузочные таблицу перед сохранением делеций, так что вы получаете перезагрузке таблицу, в которой по-прежнему содержит те же самые данные. Положите self.tableView.reloadData() после сохранения.

+0

не помогает, мои приложения аварии – bobo

Смежные вопросы