在NSMutableArray [iOS]中添加时重复对象

时间:2014-03-18 03:03:17

标签: ios uitableview nsmutablearray

您好我有这个问题,如果我在我的uitableview中添加超过13个项目,那么项目将重复

这是我的

代码

添加:

[categoryList insertObject:inputcategory atIndex:0];
NSIndexPath *indexpath = [NSIndexPath indexPathForRow:0 inSection:0];
[self.tableView insertRowsAtindexPaths@[indexpath] withRowAnimation:UITableViewRowAnimationAutomatic];

CellForRow:

if (cell == nil){
 cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
cell.textlabel.text = [categoryList objectAtIndex:indexPath.row];
}

NumberofRows

return [categoryList count];

前12个项目没问题但是之后它在我的uitableview中再次在我的NSMutableArray中添加了相同的最后一个对象,当我重新加载它时,它只记录了12个项目。

3 个答案:

答案 0 :(得分:4)

cellForRowAtIndexPath:方法更改

 if (cell == nil){
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
    cell.textlabel.text = [categoryList objectAtIndex:indexPath.row];
 }

 if (cell == nil){
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
 }
 cell.textlabel.text = [categoryList objectAtIndex:indexPath.row];

如果您在if (cell == nil)中设置文字,则在重新使用该单元格时不会更新。重用单元格时不会为零。

答案 1 :(得分:1)

Akhilrajtr的答案是正确的,但这是旧的做法。在2014年,iOS 6+应该使用UITableView方法

- (void)registerClass:(Class)cellClass forCellReuseIdentifier:(NSString *)identifier

- (void)registerNib:(UINib *)nib forCellReuseIdentifier:(NSString *)identifier

- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath

cellForRowAtIndexPath:中获取单元格变得更加简单......

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];

"标识符"是用于标识要重用的单元格的唯一字符串,就像旧方法一样。

从Apple的文档中,"如果现有单元格可用,则此方法会出现,或者根据先前注册的类或nib文件创建新单元格。#34;您不再需要使用initWithStyle,如果您认为这样做,则考虑将UITableViewCell子类化,以更精确地控制单元格的外观。

不再需要检查单元格是否为零。如果您的单元格是普通的UITableViewCell,或者配置您的子类化单元格(当然应该已经准备好使用prepareForReuse:方法重新使用),请继续设置标签。

答案 2 :(得分:0)

Apple提及此in their documentation on UITableViews.

的效果

它应该是关于重用细胞。因此,如果cell != nil你无法解决此问题:

 if (cell == nil){
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
     cell.textlabel.text = [categoryList objectAtIndex:indexPath.row];  
}

重复使用细胞。 - 对象分配具有性能成本,特别是如果分配必须在短时间内重复发生 - 例如,当用户滚动表视图时。如果重复使用单元格而不是分配新单元格,则可以大大提高表格视图的性能。