我在我的应用中有一个包含根词典中的行的plist,当我在NSMutableArray
中通过以下代码添加这些行时:
NSString * item = [badgeDict objectForKey:[NSString stringWithFormat:@"item%i",indexPath.row+1]];
[badgeArray addObject:item];
它给了我乱序排序的数组...... 我希望它以相同的顺序...记住那些行的键(item1,item2,item3 ......等)......
应如何修复?
答案 0 :(得分:2)
在tableView:cellForRowAtIndexPath中:您可以这种方式访问对象
NSArray *keys = [[badgeDict allKeys] sortedArrayUsingSelector:@selector(compare:)];
id value = [badgeDict objectForKey:[keys objectAtIndex:indexPath.row]];
如果您的plist很小,这是好的,否则在您的成员变量中保存键顺序。
答案 1 :(得分:1)
考虑到每当需要新单元格时都会调用tableView:cellForRowAtIndexPath:
:第一次填充UITableView
时以及滚动时出现单元格时。因此,在此方法中填充数据源并不是一个好习惯。
我建议您在viewDidLoad
中填充数据。如果UITableView
需要以某种方式刷新包含的信息,那么创建一个方法来执行此操作并从viewDidLoad
调用它并从中进行刷新(例如,按下按钮,当拉到刷新时,... )。
答案 2 :(得分:1)
我想你把这个代码移到viewDidLoad方法而不是cellForRowAtIndexPath,你可能会调用像reloadRowsAtIndexPaths这样的方法,如果你的badgeArray是实例变量会破坏顺序,而且你可能无法完全填满整个数组,因为没有所有行都会立即显示在屏幕上。
您的方法似乎没有效率。如果您的badgeDict是一个可以更改的主题,您可以尝试实施通知。只需将您的UIViewController作为观察者添加到badgeDict更改并在发生此类事件时重新加载badgeArray。
这样做:
添加:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshBadgeArray :) name:@“BadgeChanged”object:nil];
:
[[NSNotificationCenter defaultCenter] removeObserver:self];
更改badgeDict的位置:
[[NSNotificationCenter defaultCenter] postNotificationName:@“BadgeChanged”对象:self];
答案 3 :(得分:1)
是的,因为你的代码在cellForRowAtIndexPath中,所以它会被扰乱。
UITableViewCells被缓存。由于您没有显示相关的周围代码,因此很可能您正在重新显示缓存的单元格。