原型细胞uitableview

时间:2012-06-06 02:38:49

标签: iphone xcode uitableview

您好我尝试使用故事板使用4个原型单元格。对于每个原型单元格,我有一个带有我的标签的类uitableviewCell。

查看我的代码:

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


    static NSString *CellIdentifier  = @"ProfilCell";
    static NSString *CellIdentifier1 = @"ProfilCell1";
    static NSString *CellIdentifier2 = @"ProfilCell2";
    static NSString *CellIdentifier3 = @"ProfilCell3";
    static NSString *CellIdentifier4 = @"ProfilCell4";

    if(indexPath.section == 0) 
    {
        ProfilCell* cell =(ProfilCell*)  [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

        cell.pseudoLabel.text=[[infoArray objectAtIndex:indexPath.row]valueForKey:@"pseudo"];

        return cell;

    }

      if(indexPath.section == 1) 
      {
        ProfilCell2* cell = (ProfilCell2*) [tableView dequeueReusableCellWithIdentifier:CellIdentifier1];

       cell.textLabel.text= [[infoArray objectAtIndex:indexPath.row]valueForKey:@"status"];

        return cell;

    }

   if(indexPath.section == 2) 
    {
        switch (indexPath.row) 
        {
            case 0:
            {

                 ProfilCell3* cell =(ProfilCell3*)  [tableView dequeueReusableCellWithIdentifier:CellIdentifier2];
                 cell.ageLabel.text=  [[infoArray objectAtIndex:indexPath.row]valueForKey:@"age"];
              return cell;
            }
                break;

            case 1:

            {

                ProfilCell4* cell = (ProfilCell4*) [tableView dequeueReusableCellWithIdentifier:CellIdentifier3];
                cell.deptLabel.text= [[infoArray objectAtIndex:indexPath.row]valueForKey:@"localite"];

                return cell;

            }
                break;
            case 2:
            {
                ProfilCell5* cell = (ProfilCell5*) [tableView dequeueReusableCellWithIdentifier:CellIdentifier4];


                cell.membreLab.text= [[infoArray objectAtIndex:indexPath.row]valueForKey:@"membre"];

                return cell;

            }
                break;   
            default:
                break;
        }
    }
          return nil;
}

在第0部分第1节中,我的标签中有数据,但在第2部分的情况下,我有这个:

[__NSArrayI objectAtIndex:]: index 1 beyond bounds [0 .. 0]'

为什么我的数组似乎是空的

现在可以为indexPath提供0,因为我在数组中只有一个对象!!!

4 个答案:

答案 0 :(得分:1)

你应该尝试这样的事情......

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

    static NSString *CellIdentifier = @"ProfilCell";
    static NSString *CellIdentifier1 = @"ProfilCell1";
    static NSString *CellIdentifier2 = @"ProfilCell2";
    static NSString *CellIdentifier3 = @"ProfilCell3";

    id cell = nil;

    if(indexPath.section == 0) {
              cell = (ProfilCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
              cell.pseudoLabel.text= [[infoArray objectAtIndex:indexPath.row]valueForKey:@"pseudo"];
    }

    if(indexPath.section == 1) {
            cell = (ProfilCell2*) [tableView dequeueReusableCellWithIdentifier:CellIdentifier1];
            cell.statusLabel.text= [[infoArray objectAtIndex:indexPath.row]valueForKey:@"status"];
    }

    if(indexPath.section == 2) {
            cell =(ProfilCell3*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier2];
            cell.ageLabel.text= [[infoArray objectAtIndex:indexPath.row]valueForKey:@"age"];
    }

    if(indexPath.section == 3) {
            cell = (ProfilCell4*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier3];
            cell.deptLabel.text= [[infoArray objectAtIndex:indexPath.row]valueForKey:@"localite"];
    }


    return cell;

    }

我在这里所做的是为id类型的单元格设置一个var,这意味着它可以是任何东西。在if语句中,您决定使用哪个单元格,并相应地进行设置。最后只返回1个单元格实例,而不是每个语句。希望这有帮助

答案 1 :(得分:1)

您应该确认您对dequeueReusable的每次调用...实际上都返回了一个单元格。使用:

NSAssert (cell, @"Missed Cell");

在每个'if'语句的正文中。我怀疑是否有一个零细胞被归还。这是因为您的重用标识符“ProfilCell”,“ProfilCell1”,...与故事板中的单元标识符不一致。要修复它,请转到故事板,逐个选择每个原型单元格,确认“标识符”与代码中的内容一致。如果没有,请将其更改为同意。

'标识符'必须匹配;不是'标签'!

答案 2 :(得分:0)

检查ProfilCell,ProfilCell2,ProfilCell3和ProfilCell4是否都是UITableViewCell的子类

同时检查您的单元格标识符是否与故事板中的标识符匹配。

答案 3 :(得分:-2)

致电dequeueReusableCellWithIdentifier:后,必须检查nil的返回值。如果返回的值不是nil,那么你没事;你从队列中得到了一个可重用的单元格。 但如果返回的值为nil ,则队列中没有可用的可重用单元格。 (对于新创建的表,情况总是如此。)在后一种情况下,您必须使用allocinit以编程方式创建一个新单元格:

cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                               reuseIdentifier:@"TableViewCell"] autorelease];

或从.xib文件加载:

cell = [[[NSBundle mainBundle] loadNibNamed:@"TableViewCell"
                                      owner:self options:nil] lastObject];

在您的情况下,您可以尝试以下内容(对其他部分重复):

if (indexPath.section == 0)
{
    ProfilCell *cell = (ProfilCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)  // if we did not get a reusable cell from the queue, we make one…
    {
        cell = [[ProfilCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    cell.pseudoLabel.text= [[infoArray objectAtIndex:indexPath.row]valueForKey:@"pseudo"];
    return cell;
}