所以我不知道如何写一个解释我问题的简单标题。
我的屏幕上有一个UITableView。只要表格视图小于屏幕(所有单元格都适合屏幕而不滚动),一切都很好。但是,一旦用户需要滚动屏幕以找到位于表格底部的单元格,一些单元格就会随机更改其选择状态。 我像这样实现了UITableView:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *simpleTableIdentifier = @"";
switch (indexPath.section)
{
case 1:
{
if (indexPath.row == 0)
{
simpleTableIdentifier = @"EventDateCell";
}
else
{
simpleTableIdentifier = @"EventDateSelectCell";
}
[...]
return cell;
}break;
case 2:
{
simpleTableIdentifier = @"SelectPlayerCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
}
Player *player = [self.playerController getPlayerAtPosition:indexPath.row];
cell.textLabel.text = [NSString stringWithFormat:@"%@", player.persistentData.name];
return cell;
}break;
default:
{
simpleTableIdentifier = @"EventNameCell";
[...]
return cell;
}break;
}
}
xCode是否会根据屏幕上显示的单元格更改indexPath.row?
标记所选单元格的代码:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if(indexPath.section == 1 && indexPath.row == 0)
{
[..]
}
else if (indexPath.section == 2)
{
// close date picker if it is still open
if (self.selectingEventDate == TRUE)
{
[...]
}
if(self.createdEvent != nil)
{
if ([[tableView cellForRowAtIndexPath:indexPath] accessoryType] == UITableViewCellAccessoryCheckmark)
{
[self tableView:tableView didDeselectRowAtIndexPath:indexPath];
}
else
{
[[tableView cellForRowAtIndexPath:indexPath] setSelected:TRUE];
[[tableView cellForRowAtIndexPath:indexPath] setAccessoryType: UITableViewCellAccessoryCheckmark];
[self.eventController addPlayerToEvent:self.createdEvent :[self.playerController getPlayerAtPosition:indexPath.row]];
}
}
}
}
- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
{
if(indexPath.section == 1 && indexPath.row == 0)
{
[...]
}
else if (indexPath.section == 2)
{
if(self.createdEvent != nil)
{
[[tableView cellForRowAtIndexPath:indexPath] setSelected:FALSE];
[[tableView cellForRowAtIndexPath:indexPath] setAccessoryType: UITableViewCellAccessoryNone];
[self.eventController removePlayerFromEvent:self.createdEvent :[self.playerController getPlayerAtPosition:indexPath.row] :FALSE];
}
}
}
我发现:如果标记了第一个单元格,则会有12个单元格正确显示,并且会检查第13个单元格。
答案 0 :(得分:5)
首先,您选择一个Array,它在您选择Cell时存储该值,并在单击第二个单元格时删除该值。
在ViewController.h文件中
@property(nonatomic,retain)NSMutableArray * arySelectionState;
在ViewController.m文件中
- (void)viewDidLoad
{
[super viewDidLoad];
arySelectionState = [[NSMutableArray alloc]init];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
custom_Cell *cell = [tableView dequeueReusableCellWithIdentifier:@"CellDetails" forIndexPath:indexPath];
if ([arySelectionState containsObject:[NSNumber numberWithLong:indexPath.row]])
{
cell.accessoryType = UITableViewCellAccessoryCheckmark;
}
else
{
cell.accessoryType = UITableViewCellAccessoryNone;
}
[cell.labtest setText:[NSString stringWithFormat:@"Lable_%ld",(long)indexPath.row]];
// Configure the cell...
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if ([arySelectionState containsObject:[NSNumber numberWithLong:indexPath.row]])
{
[arySelectionState removeObject:[NSNumber numberWithLong:indexPath.row]];
[[tableView cellForRowAtIndexPath:indexPath] setAccessoryType: UITableViewCellAccessoryNone];
}
else
{
[arySelectionState addObject:[NSNumber numberWithLong:indexPath.row]];
[[tableView cellForRowAtIndexPath:indexPath] setAccessoryType: UITableViewCellAccessoryCheckmark];
}
}
它的工作精细......
答案 1 :(得分:2)
仅在cellForRowAtIndexPath:
中更改单元格的外观。如果您在其他位置进行更改,它们将应用于dequeueReusableCellWithIdentifier:
返回给您的缓存单元格。
在这种情况下,给玩家一个"选择"属性,在需要时设置,并调用reloadData
。在cellForRowAtIndexPath:
中使用该属性来设置单元格选择状态。