目标C:滚出屏幕后(和后面),单元格文本消失

时间:2011-06-17 01:01:05

标签: objective-c ios uitableview identifier

我正在创建一个带有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;

2 个答案:

答案 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,或类似的东西?)并了解更多信息。