uitableview单元格在加载时关闭屏幕时显示错误数据

时间:2014-05-13 07:16:22

标签: ios iphone objective-c ipad uitableview

我的UITableView超出了屏幕区域。我显示了NSMutableArray中填充了NSDictionary个对象的一些数据。对象都具有group属性truefalse,如果group为真,则应在单元格中显示UIButton(以展开群组)。
我在UIButton的单元格prototype中创建了storyboard。我给它alpha 0.如果我加载列表按钮不在任何单元格(duh)。这是我的cellForRowAtIndexPath

if ([[contacts[indexPath.section] valueForKey:@"group"] isEqualToString:@"true"]) {
    UIButton *button = (UIButton*)[cell viewWithTag:999];
    [button setAlpha:1.0f];
}

如果group属性为true,则按钮可见。在我当前的测试用例中,前三个对象的group设置为true,其余的group设置为false。现在我的问题是,前三个单元格有一个可见的按钮(按预期),但是沿着表格的一些单元格也有一个。我在上面的if statement中加了一个断点,它实际上只有三次。

它发生在一个模式中,前三个单元格有一个按钮,而不是五个单元格,而另外三个单元格有一个可见按钮。比另外五个没有按钮和最后一个单元格(我想如果我添加两个单元格,他们也将有一个按钮)

具有按钮的第二组单元格在屏幕外部开始,因此可能与它有关。

还有一个相关的事情,还有一些文本显示我从同一个数组中取出组标记,这个文本显示正确。因此,细胞不是以某种方式重复,而只是if statement部分被搞砸了。

我仔细检查了程序进入if statement的次数,它实际上只有三次(前三个条目)。如果我对按钮上的setAlpha电话进行评论,则任何地方都不会显示任何按钮,因此也没有其他位置可以显示该按钮。

我在使用iOS 7.1的iPad 4上进行测试。

如果我减少行的高度以使它们全部适合屏幕,则问题就消失了,所以它在加载数据时肯定与落在屏幕区域之外的行有关。


修改

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = nil;
    UIColor *color = [UIColor colorWithRed:(1.0f/255.0f)*220 green:(1.0f/255.0f)*220 blue:(1.0f/255.0f)*225 alpha:1.0f];

    if (indexPath.row == 0) {
        cell = [tableView dequeueReusableCellWithIdentifier:@"single" forIndexPath:indexPath];

        UILabel *screenname = (UILabel*)[cell viewWithTag:10];
        UILabel *username = (UILabel*)[cell viewWithTag:11];
        UIImageView *avatar = (UIImageView*)[cell viewWithTag:20];

        if ([[contacts[indexPath.section] valueForKey:@"group"] isEqualToString:@"true"]) {
            NSDictionary *c = contacts[indexPath.section];

            UIButton *button = (UIButton*)[cell viewWithTag:999];
            [button setAlpha:1.0f];

            button.tag = indexPath.section;
            [button addTarget:self action:@selector(onGroupButtonClick:) forControlEvents:UIControlEventTouchUpInside];
            int numUsersInGroup = [[c valueForKey:@"users"] count];
            NSString *numUsersInGroupString = [NSString stringWithFormat:@"%d",numUsersInGroup];
            [button setTitle:numUsersInGroupString forState:0];
            [button setNeedsDisplay];

            screenname.text = @"Groep";
            username.text = [NSString stringWithFormat:@"%@",[c valueForKey:@"groupName"]];
        } else {
            User *c = (User*)contacts[indexPath.section];

            UIButton *button = (UIButton*)[cell viewWithTag:999];
            [button setAlpha:0.0f];

            screenname.text = [NSString stringWithFormat:@"%@",[c valueForKey:@"screenName"]];
            username.text = [NSString stringWithFormat:@"%@",[c valueForKey:@"username"]];

            [avatar setImage:[UIImage imageNamed:@"avatar.png"]];
        }

        [GeneralFunctions setFontFamily:@"KozGoPro-ExtraLight" forView:cell andSubViews:YES];
        [GeneralFunctions setFontFamily:@"KozGoPro-Medium" forView:screenname andSubViews:YES];

        [cell.layer setShadowColor:[color CGColor]];
        [cell.layer setShadowOffset:CGSizeMake(0,4)];
        [cell.layer setShadowRadius:3.0f];
        [cell.layer setShadowOpacity:1.0f];
        cell.clipsToBounds = NO;
        cell.layer.masksToBounds = NO;
    }

    if (indexPath.row > 0) {
        cell = [tableView dequeueReusableCellWithIdentifier:@"group" forIndexPath:indexPath];

        UILabel *screenname = (UILabel*)[cell viewWithTag:10];
        UILabel *username = (UILabel*)[cell viewWithTag:11];

        User *c = (User*)[contacts[indexPath.section] valueForKey:@"users"][indexPath.row-1];

        screenname.text = [NSString stringWithFormat:@"%@",[c valueForKey:@"screenName"]];
        username.text = [NSString stringWithFormat:@"%@",[c valueForKey:@"username"]];

        [GeneralFunctions setFontFamily:@"KozGoPro-ExtraLight" forView:cell andSubViews:YES];
        [GeneralFunctions setFontFamily:@"KozGoPro-Medium" forView:screenname andSubViews:YES];
    }

    return cell;
}

1 个答案:

答案 0 :(得分:1)

重复使用单元格时,您不会将按钮设置回0.0 alpha。每当您重复使用单元格时,您需要重置单元格或更改单元格的属性,否则它将显示旧内容

if ([[contacts[indexPath.section] valueForKey:@"group"] isEqualToString:@"true"]) {
    NSDictionary *c = contacts[indexPath.section];

    UIButton *button = (UIButton*)[cell viewWithTag:999];
    [button setAlpha:1.0f];

    //this line changes your tag and hence in else condition for reused cell it'll come nil
    button.tag = indexPath.section;

} else {
    UIButton *button = (UIButton*)[cell viewWithTag:999];
    [button setAlpha:0.0f];
}

建议而不是按标签访问按钮,通过使用属性按类型将单元格转换为自定义单元格来访问它