根据数据更新表视图单元的标签属性

时间:2017-12-31 17:20:26

标签: ios objective-c uitableview

所以我有一个自定义的表格视图单元格,我在它自己的xib中设计,包含一些标签和图像。

我正在尝试更新其中一个标签的背景颜色,具体取决于标签上的文字&给它圆润的边缘。

我正在使用以下代码尝试这个边缘,但是它不起作用,我不知道这个代码在滚动时更新每个单元格需要它在哪里。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"CardCell";
    CardTableViewCell *cell = (CardTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil)
    {
        //cell = [[CardTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CardCell"];
        cell = [[[NSBundle mainBundle]loadNibNamed:@"CardCell" owner:self options:nil]objectAtIndex:0];

    }

    // Configure the cell...
    NSManagedObject *card = [self.cards objectAtIndex:indexPath.row];
    [cell.cardName setText:[card valueForKey:@"name"]];
    [cell.type setText:[card valueForKey:@"attribute"]];
    [cell.attack setText:[card valueForKey:@"attack"]];
    [cell.defense setText:[card valueForKey:@"defense"]];
    [cell.species setText:[card valueForKey:@"species"]];
    [cell.starLevel setText:[card valueForKey:@"stars"]];
    cell.type.layer.cornerRadius = cell.type.bounds.size.height / 8;


    UIImage *cardImage = [UIImage imageWithData:[card valueForKey:@"thumb"]];
    [cell.cardImage setImage:cardImage];

    return (UITableViewCell *)cell;
}

正确显示文字和卡片图片。

2 个答案:

答案 0 :(得分:3)

单元格在cellForRowAtIndexPath中没有框架,因此未设置角半径。 在这种情况下,您应该在willDisplayCell

中设置角半径
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (yourCellShouldHaveRoundedCorners) {
        cell.layer.cornerRadius = cell.bounds.size.height / 8;
    }
}

标签的背景颜色应在cellForRowAtIndexPath

中使用

另外,我看到你在cellForRowAtIndexPath中的单元格上设置了很多属性(即类型,攻击,防御等)。由于您已经有自定义单元格,因此最好在单元格上创建NSManagedObject属性,并在此对象的setter上设置所有这些属性。

这样,你只需要调用cell.managedObject = card,而setter就会设置其他属性。

这种方法更加面向模型,它可以为您节省一些代码重复。

答案 1 :(得分:0)

尝试使用固定数字 cell.type.bounds.size.height 不会在cellForRowAt中呈现正确的值

 cell.type.layer.cornerRadius = 10 ;

 cell.type.clipsToBounds = YES;

或者将其添加到单元格类

 -(void)layoutSubviews
 {
     self.type.layer.cornerRadius = self.type.bounds.size.height / 8;
 }

关于颜色,它将在 cellForRowAt 中完美地工作

 if(yourLogic)
 {
    cell.type.backgroundColor = [UIColor redColor];

 }
 else
 {
    cell.type.backgroundColor = [UIColor greenColor];
 }