Objective c 为什么plist中的字符串在UITableView中的显示顺序不正确?
我的应用程序中有一个plist,它包含根字典中的行,当我通过以下代码在Objective c 为什么plist中的字符串在UITableView中的显示顺序不正确?,objective-c,ios,uitableview,Objective C,Ios,Uitableview,我的应用程序中有一个plist,它包含根字典中的行,当我通过以下代码在NSMutableArray中添加这些行时: NSString * item = [badgeDict objectForKey:[NSString stringWithFormat:@"item%i",indexPath.row+1]]; [badgeArray addObject:item]; 它给了我混乱的排序数组。。。 我希望它的顺序是一样的。。。请记住,这些行的键称为(item1、item2、item3…,等等)
NSMutableArray
中添加这些行时:
NSString * item = [badgeDict objectForKey:[NSString stringWithFormat:@"item%i",indexPath.row+1]];
[badgeArray addObject:item];
它给了我混乱的排序数组。。。
我希望它的顺序是一样的。。。请记住,这些行的键称为(item1、item2、item3…,等等)
如何修复它?请考虑在需要新单元格时调用
tableView:cellForRowAtIndexPath:
:第一次填充UITableView时以及滚动时出现单元格时。因此,用这种方法填充数据源不是一种好的做法
我建议您在viewDidLoad
中填充数据。如果UITableView
需要以某种方式刷新包含的信息,则创建一个方法来执行此操作,并从viewDidLoad
和刷新发生的位置调用它(例如,按下按钮,拉动刷新时,…).请考虑在需要新单元格时调用tableView:cellForRowAtIndexPath:
:第一次填充UITableView时以及滚动时出现单元格时。因此,用这种方法填充数据源不是一种好的做法
我建议您在viewDidLoad
中填充数据。如果UITableView
需要以某种方式刷新包含的信息,那么创建一个方法来执行此操作,并从viewDidLoad
和刷新发生的位置调用它(例如,按下按钮,当拉动刷新时,…)我建议您将此代码移动到viewDidLoad方法,而不是cellForRowAtIndexPath,可能是调用了reloadRowsAtIndexPaths之类的方法,如果badgeArray是实例变量,则会破坏顺序,此外,您可能无法完全填充整个数组,因为并非所有行都同时显示在屏幕上
你的方法似乎效率不高。如果您的badgeDict可能会更改,您可以尝试执行通知。只需将UIViewController作为观察者添加到badgeDict更改中,并在发生此类事件时重新加载badgeArray
为此:
- 在viewController的viewDidLoad中添加:
[[NSNotificationCenter defaultCenter]添加观察者:自选择器:@selector(refreshBadgeArray:)名称:@“BadgeChanged”对象:nil]
- 在viewController的dealloc中添加:
[[NSNotificationCenter defaultCenter]移除观察者:self]
- 更改badgeDict的位置:
[[NSNotificationCenter defaultCenter]postNotificationName:@“BadgeChanged”对象:self]
我建议您将此代码移到viewDidLoad方法,而不是cellForRowAtIndexPath,这可能是因为您调用了诸如reloadRowsAtIndexPaths之类的方法,如果您的badgeArray是实例变量,这将打破顺序,而且您可能无法完全填充整个数组,因为并非所有行都同时显示在屏幕上
你的方法似乎效率不高。如果您的badgeDict可能会更改,您可以尝试执行通知。只需将UIViewController作为观察者添加到badgeDict更改中,并在发生此类事件时重新加载badgeArray
为此:
- 在viewController的viewDidLoad中添加:
[[NSNotificationCenter defaultCenter]添加观察者:自选择器:@selector(refreshBadgeArray:)名称:@“BadgeChanged”对象:nil]
- 在viewController的dealloc中添加:
[[NSNotificationCenter defaultCenter]移除观察者:self]
- 更改badgeDict的位置:
[[NSNotificationCenter defaultCenter]postNotificationName:@“BadgeChanged”对象:self]
在tableView:cellForRowAtIndexPath中:您可以通过以下方式访问对象
NSArray *keys = [[badgeDict allKeys] sortedArrayUsingSelector:@selector(compare:)];
id value = [badgeDict objectForKey:[keys objectAtIndex:indexPath.row]];
如果plist很小,则这很好,否则请在成员变量中保存键顺序。在tableView:cellForRowAtIndexPath中:您可以通过以下方式访问对象
NSArray *keys = [[badgeDict allKeys] sortedArrayUsingSelector:@selector(compare:)];
id value = [badgeDict objectForKey:[keys objectAtIndex:indexPath.row]];
如果您的plist很小,则这很好,否则请在您的成员变量中保存密钥顺序。是的,它将被置乱,因为您的代码位于cellForRowAtIndexPath中
UITableViewCells被缓存。由于您没有显示相关的周围代码,很可能您正在重新显示缓存的单元格。是的,它将被置乱,因为您的代码位于cellForRowAtIndexPath中
UITableViewCells被缓存。由于您没有显示相关的周围代码,很可能您正在重新显示缓存的单元格。您还说数组出现故障,您是否打印了数组的实际内容以验证这一点?您还说数组出现故障,您是否打印了数组的实际内容以验证这一点?