1

我的应用程序中有一个 plist,其中包含 Root Dictionary 中的行,当我NSMutableArray通过以下代码添加这些行时:

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

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

应该如何修复?

4

4 回答 4

2

在tableView: cellForRowAtIndexPath: 中可以通过这种方式访问​​对象

NSArray *keys = [[badgeDict allKeys] sortedArrayUsingSelector:@selector(compare:)];
id value = [badgeDict objectForKey:[keys objectAtIndex:indexPath.row]];

如果您的 plist 很小,这很好,否则在您的成员变量中保存键顺序。

于 2012-10-21T10:43:44.203 回答
1

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

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

于 2012-10-21T11:26:00.543 回答
1

我建议您将此代码移动到 viewDidLoad 方法而不是 cellForRowAtIndexPath,这可能是您调用了 reloadRowsAtIndexPaths 之类的方法,如果您的 badgeArray 是实例变量,这将破坏顺序,而且您可能无法完全填充整个数组,因为并非所有行都是立即显示在屏幕上。

您的方法似乎没有效率。如果您的 badgeDict 可能会更改,您可以尝试实施通知。只需将您的 UIViewController 作为观察者添加到 badgeDict 更改并在发生此类事件时重新加载 badgeArray。

为此:

  • 在你的 viewController 的 viewDidLoad 添加:

    [[NSNotificationCenter defaultCenter] addObserver:self 选择器:@selector(refreshBadgeArray:) name:@"BadgeChanged" object:nil];

  • 在您的 viewController 的 dealloc 中添加:

    [[NSNotificationCenter defaultCenter] removeObserver:self];

  • 在更改 badgeDict 的地方:

    [[NSNotificationCenter defaultCenter] postNotificationName:@"BadgeChanged" object:self];

于 2012-10-21T10:43:24.220 回答
1

考虑tableView:cellForRowAtIndexPath:在需要新单元格时调用:第一次填充UITableView时以及滚动时出现单元格时。因此,以这种方法填充数据源并不是一个好习惯。

我建议您将数据填充到viewDidLoad. 如果UITableView需要以某种方式刷新包含的信息,则创建一个方法来执行此操作viewDidLoad并从刷新发生的位置调用它(例如按下按钮,拉动刷新时......)。

于 2012-10-21T10:31:31.000 回答