带自定义单元格的UITableView

时间:2010-07-08 21:14:02

标签: iphone objective-c xcode uitableview

我有一个UIView,并在其上放置了一个tableview,tableview使用从NSArray提供数据的自定义单元格。一些奇怪的事情发生在最多我只能得到表格显示2个单元格,即使那里有10个单元格,并且所有10个单元格都已填充。

我有一个不同的笔尖以同样的方式排列,它的工作非常完美。

正在发生的事情的截图(5是10个单元格中的第5个,所有单元格都填充了数据)。

http://img692.imageshack.us/img692/1465/screenshot20100708at215.jpg

-(UITableViewCell *)tableView:(UITableView *)tblView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"ISB points cellForRowAtIndexPath start");
    NSLog(@"Elements in array = %d",[self.listData count]);
    //
    static NSString *cellID = @"PointsCellIdentifier";

    PointsCustomCell *cell = [tblView dequeueReusableCellWithIdentifier:cellID];

    if( cell == nil )
    {
        NSArray *nibObjects = [[NSBundle mainBundle]loadNibNamed:@"PointsCustomCell" owner:nil options:nil];

        for( id currentObject in nibObjects )
        {
            NSLog(@"nibObjects count = %d", [nibObjects count]);

            if( [currentObject isKindOfClass:[PointsCustomCell class]] )
            {
                cell = (PointsCustomCell *)currentObject;
            }// if
        }// for
    }// if

    if( indexPath.row < [listData count] )
    {
        RiderPointsData *riderPts = (RiderPointsData *)[listData objectAtIndex:indexPath.row];      
        cell.posLabel.text = riderPts.pos;
        cell.nameLabel.text = riderPts.name;
        cell.pointsLabel.text = riderPts.points;
        cell.winsLabel.text = riderPts.wins;
        //[riderPts release];               
    }

    NSLog(@"ISB points cellForRowAtIndexPath end");

    return cell;
}

2 个答案:

答案 0 :(得分:1)

看起来你正在迭代你的笔尖中的所有对象,其中可能包含它包含的UITableViewCell和4个UILabel,并且只有部分时间是正确分配了单元格。

您不需要nibObjects数组或for循环。如果您为loadNibNamed提供owner参数,则会将文件所有者设置为该值。如果您的numberOfRowsInSection方法返回indexPath.row < [listData count],您也不需要[listData count]检查。所以将代码更改为:

-(UITableViewCell *)tableView:(UITableView *)tblView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
   static NSString *cellID = @"PointsCellIdentifier";

   PointsCustomCell *cell = [tblView dequeueReusableCellWithIdentifier:cellID];

   if( cell == nil )
   {
     [[NSBundle mainBundle]loadNibNamed:@"PointsCustomCell" owner:self options:nil];

     // assign IB outlet to cell
     cell = self.cellOutlet; // cellOutlet should be whatever you name your IBOutlet
     self.cellOutlet = nil;

   }// if

   RiderPointsData *riderPts = (RiderPointsData *)[listData objectAtIndex:indexPath.row];      
   cell.posLabel.text = riderPts.pos;
   cell.nameLabel.text = riderPts.name;
   cell.pointsLabel.text = riderPts.points;
   cell.winsLabel.text = riderPts.wins;

   return cell;
}

  1. 在控制器中创建UITableViewCell插座
  2. 使您的控制器成为PointsCustomCell.xib
  3. 中的文件所有者
  4. 将您的UITableViewCell绑定到您在步骤1中创建的插座

答案 1 :(得分:0)

看起来listData中的一些数据是NULL。 你如何填充listData?我想如果你添加这两行并让我们看看控制台输出会更好。

//add this line in tableView:cellForRowAtIndexPath:
NSLog(@"indexPath.row = %d listData.count = %d ",indexPath.row,[listData count]);
//add this line in if( indexPath.row < [listData count] )
NSLog(@"RiderPointsData = %@ %@", riderPts,[riderPts class]);