自定义UITableViewCell与动态内容

时间:2012-10-07 19:05:33

标签: iphone ios uitableview

我正在尝试创建一个UITableView,它从XIB加载自定义单元格。我有EventsCell.xib以及.m和.h文件。

单元格的内容和高度是动态的,因为它可以包含未知数量的子视图。

这是加载单元格的代码。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *CellIdentifier = @"EventsCellIdentifier";

        EventsCell *cell = (EventsCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

        if (cell == nil) 
        {
            NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"EventsCell" owner:self options:nil];
            cell = [nib objectAtIndex:0];        
        }

        NSDictionary *hour = [[[eventsArray objectAtIndex:[indexPath section]] valueForKey:@"hours"] objectAtIndex:[indexPath row]];

        NSArray *events = [hour valueForKey:@"events"];

        cell.events = events;
        cell.timeLabel.text = [hour valueForKey:@"name"];

        int offset = 0;
        for(NSDictionary *event in events)
        {
            UIView *vvv = [[UIView alloc] initWithFrame:CGRectMake(50, offset, 270, 44)];
            [vvv setBackgroundColor:[UIColor clearColor]];

            UILabel *lab = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 200, 44)];
            lab.text = [event valueForKey:@"name"];
            lab.backgroundColor = [UIColor clearColor];

            [vvv addSubview:lab];

            [cell.contentView addSubview:vvv];

            offset += 44;
        }    

        return cell;
    }

它加载单元格,但是在表格视图上滚动几次后,内容如下所示:

enter image description here

我做错了什么?..

谢谢!

====================更新====================

现在又发生了一件事。 我已经在单独的视图控制器中添加了我添加到单元格的子视图的所有元素。像吼叫一样。

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *CellIdentifier = @"EventsCellIdentifier";

        EventsCell *cell = (EventsCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

        if (cell == nil) 
        {
            NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"EventsCell" owner:self options:nil];
            cell = [nib objectAtIndex:0];        
        }

        for (UIView *subV in [cell.contentView subviews]){
            [subV removeFromSuperview];
        }    

        NSDictionary *hour = [[[eventsArray objectAtIndex:[indexPath section]] valueForKey:@"hours"] objectAtIndex:[indexPath row]];

        NSArray *events = [hour valueForKey:@"events"];

        cell.events = events;
        cell.timeLabel.text = [hour valueForKey:@"name"];

        int offset = 0;

        for(NSDictionary *event in events)
        {
            EventBoxViewController *ebvc = [[EventBoxViewController alloc] initWithNibName:@"EventBoxViewController" bundle:nil];
            ebvc.nameLabel.text = [event valueForKey:@"name"];

            [ebvc.view setFrame:CGRectMake(50, offset, 270, 44)];
            [cell.contentView addSubview:ebvc.view];

            offset += 44;
        }    

  return cell; 
 }

他们没有按照自己的意愿加载。请看下面的图片。

enter image description here

它们仅在我滚动单元格时加载,即使这样它们也不会按照它们的方式加载。 此外,标签的文本不会被分配。 关于我做错的任何想法?

谢谢。

3 个答案:

答案 0 :(得分:4)

在cell.contentView上添加了视图,由于单元格是可用的,因此它仍然会被添加, 如果我们删除所有子视图,它将起作用

for (UIView *subV in [cell.contentView subviews]){
     [subV removeFromSuperview];
}

之后添加上述代码
if (cell == nil) 
{
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"EventsCell" owner:self options:nil];
    cell = [nib objectAtIndex:0];        
}

答案 1 :(得分:1)

如果您将UIVIew *添加到表格单元原型并清除它的子视图,它就可以工作。 像这样:

 UIView* editView = (UIView*)[cell viewWithTag:102];
 for (UIView *subV in [editView subviews]){
        [subV removeFromSuperview];

答案 2 :(得分:0)

更可读的解决方案不是将单元格出列,而是每次都创建一个单元格,但这取决于由于开销而最终需要加载多少单元格。这种删除的东西看起来很讨厌。

相关问题