在 iOS 中,realm 是否支持在带动画的 tableview 中删除一行?

In iOS does realm support deleting a row in a tableview with animation?

例如,这是我关于删除表视图行的以下代码。

// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

    if (editingStyle == UITableViewCellEditingStyleDelete) {
        // Delete the row from the data source
        self.array = [Note allObjects];
        RLMRealm *realm = RLMRealm.defaultRealm;
        [realm beginWriteTransaction];
        NSLog(@"%@",self.array[indexPath.row]);
        [realm deleteObject:self.array[indexPath.row]];
        [realm commitWriteTransaction];
    }
}

虽然我得到了我想要删除行的初始结果,但不幸的是它没有动画,所以突然更新 tableview 看起来不太好。我知道通常这是在 tableview 中实现动画的实际方法 [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];

顺便说一句,这是我发现的与我的问题最接近的东西,但它对我不起作用。 https://github.com/realm/realm-cocoa/issues/1045

有什么想法吗?

你走在正确的轨道上。

您是否在某个地方用通知块更新了您的UI? ->

// Observe Realm Notifications
self.token = [realm addNotificationBlock:^(NSString *note, RLMRealm * realm) {
  [myViewController updateUI];
}];

如果是,那么您首先必须为删除设置动画,然后从领域中删除对象:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
  if (editingStyle == UITableViewCellEditingStyleDelete) {
      [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
      [self deleteItemAtIndexPath: indexPath];
  }
}

- (void)deleteItemAtIndexPath:(NSIndexPath *)indexPath {
  // Delete the row from the data source
  self.array = [Note allObjects];
  RLMRealm *realm = RLMRealm.defaultRealm;
  [realm beginWriteTransaction];
  NSLog(@"%@",self.array[indexPath.row]);
  [realm deleteObject:self.array[indexPath.row]];
  [realm commitWriteTransaction];
}

总之。只需先为您的行设置动画,然后从 Array/Realm :)

中删除数据

这就是我在 Swift 和 Realm v1.0.0

中的做法
override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
    if editingStyle == .Delete {
        deleteRowAtIndexPath(indexPath)
    }
}

private func deleteRowAtIndexPath(indexPath: NSIndexPath)
{
    let realm = try! Realm()
    let objectToDelete = objects[indexPath.row]
    do {
        try realm.write() {
            realm.delete(objectToDelete)
        }
        tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
    } catch {
        print("Could not delete site")
    }
}