在UITableView

时间:2016-02-04 05:22:07

标签: ios objective-c uitableview realm

我有一组RLMObject个模型对象,代表用户的登录帐户 可以在我的应用程序中管理通过直接映射到UITableView来公开这些对象 在应用程序中。

由于用户可以通过明确控制这些帐户对象的排序 在表视图中,模型对象按顺序具有名为orderedIndex的属性 跟踪对象的当前排序。

@interface Account : RLMObject

@property NSString *name;
@property NSInteger orderedIndex;

@end

表视图数据源从RLMResults属性访问这些帐户 父视图控制器的成员

self.accounts = [[Account allObjects] sortedResultsUsingProperty:@"orderedIndex" ascending:YES];

(由于Realm对象是' live',我永远不必手动重新加载 或重置此对象。)

当用户重新排序表视图的行时,所有的orderedIndex属性 这些Realm对象需要更新才能匹配。

这可能有很多不同的方法,有些比其他更复杂, 但最简单的是什么?

2 个答案:

答案 0 :(得分:1)

最初,我试图在确定哪些特定的Realm对象时聪明一点 受到移动的影响,只修改了他们的orderedIndex值,但这转变了 有些复杂,在某些边缘情况下(通常涉及顶部和底部的物体), 会导致不可预测的行为。

最终,我决定最终的简单性(以牺牲更多的工作为代价),我愿意 只需将我的self.accounts对象的内容复制到一个可变数组中,执行 在数组中移动操作,然后简单地重建每个对象的orderedIndex 从头开始。

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(nonnull NSIndexPath *)sourceIndexPath toIndexPath:(nonnull NSIndexPath *)destinationIndexPath
{   
   if (sourceIndexPath.row == destinationIndexPath.row) {
       return;
   }

   // Make a mutable copy of the accounts list
   NSMutableArray *array = [NSMutableArray array];
   for (Account *account in self.accounts) {
       [array addObject:account];
   }

   // Re-order this array as dictated by the table view
   Account *accountToMove = array[sourceIndexPath.row];
   [array removeObject:accountToMove];
   [array insertObject:accountToMove atIndex:destinationIndexPath.row];

   // Loop through all of the items and reset their index value
   [self.accounts.realm transactionWithBlock:^{
       NSInteger i = 0;
       for (Account *account in array) {
           account.orderedIndex = i++;
       }
   }];
}

最终完美运作。 :)

答案 1 :(得分:0)

解决此问题的另一种方法是使用Realm的List数据结构。因此,您可以拥有一个Realm对象列表,并重新排序列表中的元素与为常规数组重新排序的方式完全相同。如果有兴趣,您可以查看以下链接,了解如何为Swift完成此操作。 : - )

Incorrect UI update after reordering rows in UITableViewController