我正在尝试查看uitableview的项目,但我遇到两个困难: 1.我无法选择第一项 2.如果我选择第2和第3项,这也将在第5和第7,第9和第10等附近设置复选标记等
以下是我的代码:
#pragma mark -
#pragma mark Table View Data Source Methods
- (NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section {
return [self.listArray count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CustomCellIdentifier = @"CustomCellIdentifier";
CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:CustomCellIdentifier];
if (cell == nil)
{
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil];
for (id oneObject in nib)
if ([oneObject isKindOfClass:[CustomCell class]]) {
cell = (CustomCell *)oneObject;
}
}
NSUInteger row = [indexPath row];
if ([selectedArray containsObject:cell])
{
cell.accessoryType = UITableViewCellAccessoryCheckmark;
}
else {
cell.accessoryType = UITableViewCellAccessoryNone;
}
[cell reloadInputViews];
return cell;
}
- (NSIndexPath *)tableView:(UITableView *)tableView
willSelectRowAtIndexPath:(NSIndexPath *) indexPath{
NSUInteger row = [indexPath row];
if (row == 0)
return nil;
return indexPath;
}
- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSUInteger row = [indexPath row];
UITableViewCell *c = [tableView cellForRowAtIndexPath:indexPath];
if ([selectedArray containsObject:c])
{
c.accessoryType = UITableViewCellAccessoryNone;
[selectedArray removeObject:c];
[selectedIndexes removeObject:[NSNumber numberWithInt:row]];
}
else {
c.accessoryType = UITableViewCellAccessoryCheckmark;
[selectedArray addObject:c];
[selectedIndexes addObject:[NSNumber numberWithInt:row]];
}
}
- (CGFloat) tableView:(UITableView *)tableView
heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return kTableViewRowHeight;
}
- (void)refreshDisplay:(UITableView *)tableView {
[tableView reloadData];
}
我尝试使用
NSString *identifier = [NSString stringWithFormat:@"Cell %d", indexPath.row];
CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:identifier];
相反,但是滚动时使复选标记消失
答案 0 :(得分:2)
您的逻辑假定每行都有自己唯一的单元格对象。但是,dequeueReusableCellWithIdentifier
填充意味着您重复使用单元格对象(即当单元格从屏幕顶部滚动时,它会在屏幕底部重复使用)。你需要重做你的逻辑,不要做出这个假设。
此外,if (row == 0) return nil;
中的willSelectRowAtIndexPath
是您无法选择第一行的原因。摆脱这条线。
答案 1 :(得分:1)
由于这个原因,您无法选择第一项:
- (NSIndexPath *)tableView:(UITableView *)tableView
willSelectRowAtIndexPath:(NSIndexPath *) indexPath{
NSUInteger row = [indexPath row];
if (row == 0)
return nil;
return indexPath;
}
其余的,不存储单元格,存储索引路径。细胞可以重复使用,这迟早会引起问题。也许这会导致你现在遇到的问题。并将这些索引路径保存在NSMutableSet
中