为什么plist中的字符串在UITableView中的显示顺序不正确?

时间:2012-10-21 09:12:06

标签: objective-c ios uitableview

我在我的应用中有一个包含根词典中的行的plist,当我在NSMutableArray中通过以下代码添加这些行时:

NSString * item = [badgeDict objectForKey:[NSString stringWithFormat:@"item%i",indexPath.row+1]];
[badgeArray addObject:item];

它给了我乱序排序的数组...... 我希望它以相同的顺序...记住那些行的键(item1,item2,item3 ......等)......

应如何修复?

4 个答案:

答案 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。

这样做:

    viewController的viewDidLoad中的
  • 添加:

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshBadgeArray :) name:@“BadgeChanged”object:nil];

  • 在viewController的dealloc中添加
  • [[NSNotificationCenter defaultCenter] removeObserver:self];

  • 更改badgeDict的位置:

    [[NSNotificationCenter defaultCenter] postNotificationName:@“BadgeChanged”对象:self];

答案 3 :(得分:1)

是的,因为你的代码在cellForRowAtIndexPath中,所以它会被扰乱。

UITableViewCells被缓存。由于您没有显示相关的周围代码,因此很可能您正在重新显示缓存的单元格。