我正在创建一个带有UITableview的控制器,它包含2个部分。在第二部分中,我有一个用户列表,当我单击特定行时,我想在列表中向用户添加复选标记。我有一个问题,在我点击一个用户并将单元格滚出页面后,单元格将返回“名称”字段BLANK(参见下面的屏幕截图)。我知道这与细胞重复使用的方式有关,但我无法理解细节问题。我的代码发布在下面。有什么建议吗?
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString* ShareOnCellIdentifier = @"ShareOnholderCell";
static NSString* WhoShouldAnswerCellIdentifier = @"WhoShouldAnswerCell";
int row = [indexPath row];
User *user = [self.friendsToShareWithArray objectAtIndex:row];
if (indexPath.section == 0)
{
UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:ShareOnCellIdentifier];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ShareOnCellIdentifier];
}
cell.textLabel.text = [self.shareOnArray objectAtIndex:indexPath.row];
return cell;
}
else
{
UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:WhoShouldAnswerCellIdentifier];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:WhoShouldAnswerCellIdentifier];
}
cell.textLabel.text = user.nickname;
if (user.isSelected)
{
cell.selectionStyle = UITableViewCellAccessoryCheckmark;
}
else
{
cell.selectionStyle = UITableViewCellSelectionStyleNone;
}
return cell;
}
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
User *user = [self.friendsToShareWithArray objectAtIndex:indexPath.row];
if (indexPath.section == 1)
{
UITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath];
if (cell.accessoryType == UITableViewCellAccessoryCheckmark)
{
cell.accessoryType = UITableViewCellAccessoryNone;
user.isSelected = NO;
}
else
{
cell.accessoryType = UITableViewCellAccessoryCheckmark;
user.isSelected = YES;
}
}
}
编辑:我如何创建用户对象的示例
User *user1 = [[User alloc]init];
user1.nickname = @"Dionis";
user1.uid = @"1";
user1.isSelected = NO;
答案 0 :(得分:2)
我看到的唯一问题是你实施didSelectRowAtIndexPath:
方法的方式。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.section == 1)
{
User *user = [self.friendsToShareWithArray objectAtIndex:indexPath.row];
user.isSelected = !user.isSelected;
[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationNone];
}
}
答案 1 :(得分:1)
过去我遇到过这样的问题,因为没有意识到基本上每次单元格在可滚动的UITableView
中进入视图时,都会通过cellForRowAtIndexPath
重新请求它。我在这里看不到错误(您总是设置标签的文本),但此时我建议您在设置后检查标签的文本。:
if (!cell.textLabel.text || [[cell.textLabel.text stringByReplacingOccurrencesOfString:@" " withString:@""] isEqualToString:@""])
NSAssert(NO, @"Bad text!");
在调试中运行,如果文本为空或为零,则会在NSAssert
处“崩溃”。然后你可能能够检查周围的变量(可能user
是否为nil,或类似的东西?)并了解更多信息。