Hello Folks
我有一个表视图,我从JSON输出加载。我已经实现了检查和取消选中UITableView单元格的功能。
问题1 - 当我滚动到视图的底部时,顶部的所有选定单元格都将被取消选中。我不知道为什么会发生这种情况,如果有人可以指导我:)
Problem2 - 我想抓取tableview中的所有选定单元格,并将它们放入NSMutableArray中。我知道有很多方法可以做到这一点,但你们可以告诉我一个更有效的方法。我花了将近2天的时间来搞清楚这一点,但仍然没有运气!
谢谢和最诚挚的问候
答案 0 :(得分:2)
这是好事,因为你可能尚未完全掌握UITableView的工作原理。
它会重复使用单元格,这就是您在dequeTableCellWithIdentifier:
上调用UITableView
方法的原因。这意味着它将重用其中一个不再存在的单元格。
请勿为UITableViewCell
中的每个项目添加UITableViewDataSource
,这可能/将占用大量内存,而UITabelView
会感觉非常慢。
只需确保数据源包含对象所需的所有数据,而不是UITableViewCell
。含义标题,选定状态,......
您需要做的是在UITableViewDataSource
项目中设置单元格的选定状态,并在UITableViewDataSource
而不是UITableViewCell
中查找所选的状态。
因此,在您从JSON检索的对象中添加一个选择的属性,该属性采用BOOL。
然后在UITableViewDataSoutrce
方法cellForRowAtIndexPath
中执行以下操作:
- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *cellIdentifier = @"SomeCellIdentiefier";
UITableViewCell *cell = (SongTableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (!cell) {
//Load new cell
}
YouJSONObject *item = [self.array objectAtIndex:indexPath.row];
if (item.selecte) {
cell.accessoryType = UITableViewCellAccessoryCheckmark;
} else {
cell.accessoryType = UITableViewCellAccessoryNone;
}
}
然后,您的UITableViewDelegate
方法didSelectRowAtIndexPath
执行以下操作:
- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
YouJSONObject *item = [self.array objectAtIndex:indexPath.row];
item.selected = !item.selected;
if (item.selecte) {
cell.accessoryType = UITableViewCellAccessoryCheckmark;
} else {
cell.accessoryType = UITableViewCellAccessoryNone;
}
}