我在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;
}
答案 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)部分完成