我有一组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对象需要更新才能匹配。
这可能有很多不同的方法,有些比其他更复杂, 但最简单的是什么?
答案 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