即使里面没有数据,如何设置UITableViewCell的自定义背景颜色

时间:2013-07-31 04:25:44

标签: ios objective-c uitableview

我想完成这样的事情:

Table view cell

看到只有一个数据,但背景颜色一直持续到结束。

我知道我可以在tableView:willDisplayCell:forRowAtIndexPath:的tableview委托中进行。但是它不会进入空单元格,因此我的空单元格总是白色。

7 个答案:

答案 0 :(得分:4)

我使用以下代码显示单元格替代颜色,即使单元格未初始化。我已在scrollViewDidScroll上完成此工作,如下所示: -

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    UIView *view=[[UIView alloc] initWithFrame:tblView.frame];
    view.backgroundColor=[UIColor greenColor];

    UIView *cellView;

    int y=0;
    int i=0;

    for (UIView *view in tblView.subviews) {
        if ([NSStringFromClass([view class]) isEqualToString:@"_UITableViewSeparatorView"]) {

            cellView=[[UIView alloc] initWithFrame:CGRectMake(0, y, 320, 44)];

            if (i%2==0) {
                cellView.backgroundColor=[UIColor redColor];
            }else{
                cellView.backgroundColor=[UIColor greenColor];
            }

            [view addSubview:cellView];
            i++;
        }
    }

    tblView.backgroundView=view;
}

在滚动表视图中得到了正确的结果。但问题是,当用户每次至少滚动一次tableView时,它会起作用。 如果你将获得成功,就可以在tableView上完成重新加载。然后就可以了。

这是我在滚动tableView上的输出。

enter image description here

我也写这个方法手动调用didScrollMethod,但似乎不能很好地工作。

[tblView.delegate scrollViewDidScroll:(UIScrollView*)tblView.superclass];

但是调用下面代码的方法绝对可以正常工作。

- (void)viewDidLoad
{
    tblView=[[MyFirstView alloc] init];
    tblView.delegate=self;
    [tblView setFrame:self.view.frame];

    [self.view addSubview:tblView];

    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

-(void)viewDidAppear:(BOOL)animated{
    [tblView.delegate scrollViewDidScroll:(UIScrollView*)tblView.superclass];
}

在viewDidLoad中加载tableView后表示viewDidAppear中的didScroll工作正常。

如果在滚动时第一行波动,请插入下面的代码。

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    UIView *view=[[UIView alloc] init];
    return view;
}

答案 1 :(得分:2)

您必须将backgroundColor设置为contentView的{​​{1}}。

示例如下:

UITableViewCell

要在tableView的单元格中使用其他颜色,可以执行以下操作;

-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"identifier"];

    if (cell==nil)
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"identifier"]autorelease];
        cell.contentView.backgroundColor= [UIColor greenColor];
    }

    return cell;
}

答案 2 :(得分:0)

具有普通样式的表不会显示最后一行下面的行,因此无法使用表视图单元格生成所需的效果。关于您唯一的选择是使用交替模式创建视图,并使视图成为表视图的页脚视图。

当视图中实际行数变为奇数和偶数时,此视图需要处理更新。而且你需要让它足够高,所以如果用户将桌子向上滚动一堆,页脚仍然会到达屏幕的底部。

答案 3 :(得分:0)

除了您的单元格之外,您还可以使用“月度会议”设置一些占位符单元格,例如:

  1. tableView:numberOfRowsInSection:
  2. 中将行数返回为1 +(填充屏幕的行数)
  3. tableView:cellForRowAtIndexPath: - 检查单元格的索引路径,如果其行= 0,则这是您的动作单元格,否则,更新单元格背景,在tableView:willDisplayCell:forRowAtIndexPath:中执行相同操作。确保删除占位符单元格的selectionStyle。
  4. 或者,您可以再次使用2个单元格 - 第一个 - 您的“月度会议”单元格,第二个单元格 - 一个高度足以覆盖屏幕从第一个单元格到底部的单元格,带有条纹单元格。

答案 4 :(得分:0)

这很简单。只需要在数据源数组中包含与要查看的行一样多的项目,并且只有第一个项目是空字符串。在willDisplayCell中:forRowAtIndexPath:将背景颜色应用于所有奇数编号的单元格。

- (void)viewDidLoad {
    [super viewDidLoad];
    self.theData = @[@"Monthly Meeting",@"",@"",@"",@"",@"",@"",@"",@"",@""];
    [self.tableView reloadData];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.theData.count;
}

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.row % 2 == 1) {
        cell.backgroundColor = [UIColor colorWithRed:232/255.0 green:238/255.0 blue:222/255.0 alpha:1];
    }
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
    cell.textLabel.text = self.theData[indexPath.row];
    return cell;
}

答案 5 :(得分:0)

借助简单的数学方法将backgroundColor设置为UITableViewCell的contentView,例如:

-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"identifier"];

if (cell==nil)
 {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"identifier"]autorelease];
    if (i%2==0) {
    cell.contentView.backgroundColor= [UIColor greenColor];
    }else{
    cell.contentView.backgroundColor= [UIColor redColor];
    }
}
return cell;
}

答案 6 :(得分:-1)