UITableViewCell内部的UILabel数量未知

时间:2013-07-24 10:00:42

标签: ios objective-c cocoa-touch uitableview

我在Interface Builder中创建了一个UITableViewCell并为它创建了一个子类。在里面,我需要在标签中显示抽奖结果。我不知道我将获得多少结果,因此我无法在IB中为它创建标签,因此我在cellForRowAtIndexPath内创建它们。那么现在正在发生的事情是,当重复使用单元格时,我会继续在子视图上创建子视图。

我考虑过在Cell子类的Interface Builder \ awakeFromNib中创建标签,然后用标签填充它们,但我不知道会有多少标签。

解决问题的好方法是什么?

有没有办法在屏幕区域外删除单元格的内容?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    //Where we configure the cell in each row
    id currentRaffle = [_winnings objectAtIndex:indexPath.row];
    RaffleResultCell *cell = [tableView dequeueReusableCellWithIdentifier:@"raffleResCell"];
    if (cell == nil) {
        cell = [[RaffleResultCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"raffleResCell"];
    }
    cell.prizeTitle.text = [currentRaffle valueForKey:@"title"];
    NSArray *winningNumbers = [[currentRaffle valueForKey:@"winningNumbers"] componentsSeparatedByString:@","];
    cell.numbOfRowsPerCell = 1+ [winningNumbers count]/4;
    int row =0;
    int col=0;
    for (int i=0;i<[winningNumbers count];i++)
    {
        UILabel *temp =[[UILabel alloc]initWithFrame:CGRectMake(70*row, 30*col, 70, 20)];
        temp.textAlignment = UITextAlignmentCenter;
        temp.font=[temp.font fontWithSize:14];
        temp.text = [NSString stringWithFormat:@"%@  ",[winningNumbers objectAtIndex:i]];
        [cell.winningNumbersView addSubview:temp];
        if(row<3)
        [cell.winningNumbersView addSubview:line];
        row++;
        if(row >3)
        {
            row=0;
            col++;
        }
    }

    return cell;
}

3 个答案:

答案 0 :(得分:1)

如果要将子视图添加到单元格而不是使用默认标签,则需要删除已具有此类单元格的子视图:

while (cell.subviews.count != 0)
{
    [[cell.subviews objectAtIndex:0] removeFromSuperview];
}
// And then, add the new subviews

希望它有所帮助。

答案 1 :(得分:1)

无论何时重复使用,您每次都会添加UILabels。您只需要在创建单元格时添加UILabels

如果每次标签数量不同,这需要稍微优雅的解决方案。

也许在UIView中添加一个IB容器,其中包含您动态创建的所有UILabels,并且每次都删除所有UILabels

e.g。

for (UILabel *label in cell.labelContainer.subviews) {
    [label removeFromSuperview];
}

答案 2 :(得分:1)

这种approch存在一个问题,每次加载单元格时,无论何时调用cellForrowAtIndexpath:,标签都会在单元格中反复添加上下。为避免创建和添加UILabel 必须 在if(cell == nil)部分完成