Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 为什么plist中的字符串在UITableView中的显示顺序不正确?_Objective C_Ios_Uitableview - Fatal编程技术网

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

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…,等等)

我的应用程序中有一个plist,它包含根字典中的行,当我通过以下代码在
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被缓存。由于您没有显示相关的周围代码,很可能您正在重新显示缓存的单元格。

您还说数组出现故障,您是否打印了数组的实际内容以验证这一点?您还说数组出现故障,您是否打印了数组的实际内容以验证这一点?