多行UITableViewCells每行不同的字段

时间:2014-01-20 06:29:38

标签: ios objective-c uitableview

我有2个tableViews,第一个只从数组中加载一个列表。 另一个,每行显示详细信息。但它显示了崩溃报告:

'UITableView dataSource必须从tableView返回一个单元格:cellForRowAtIndexPath:Exception'

我的代码似乎有什么问题?我想向每一行显示来自同一sqlite行的不同细节。

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
     UITableViewCell *cell;
     //tableView 1  
     if(tableView == self.cTableLabel)
     {
          cell = [tableView dequeueReusableCellWithIdentifier:@"courseCell"];
          NSLog(@"Here.");
          Course *courses = [self.course objectAtIndex:indexPath.row];
          cell.textLabel.text =courses.cName;
          cell.detailTextLabel.text =courses.cSchool;
          return cell;
     }
     //tableView 2
     if(tableView == self.jTableLabel)
     {
          if (indexPath.row == 0)
          {
               cell = [tableView dequeueReusableCellWithIdentifier:@"JobName"];
               cell.textLabel.text = _jDetails.jName;
          }
          else if (indexPath.row == 1)
          {
               cell=  [tableView dequeueReusableCellWithIdentifier:@"JobEarnings"];
               cell.textLabel.text  = @"Job Earnings (per month): Php";
               cell.detailTextLabel.text = _jDetails.jEarnings;
          }
          return cell;
     }
     return 0;

}

4 个答案:

答案 0 :(得分:0)

首先,检查您的numberOfRowsInSection是否返回了表格的正确行数。我认为这就是它。

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if(tableView == self.cTableLabel)
    {
        return [self.course count];

    }
    //tableView 2
    if(tableView == self.jTableLabel)
    {
        return 2;
    }

    return 0;
}

否则我会在return 0;之前的cellForRowAtIndexPath或NSLog上设置一个断点,因为我的猜测既不是块被击中而你返回零。会被触发吗?

编辑 - 啊,我想如果你还没有设置一个,我会看到dequeueReusableCellWithIdentifier:会返回一个空单元格。请尝试使用dequeueReusableCellWithIdentifier: forIndexPath:。假设您先调用registerClass:[UITableViewCell class] forCellReuseIdentifier:,这将始终返回一个有效的单元格。

试一试:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell;
    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"courseCell"];
    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"JobName"];
    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"JobEarnings"];

    //tableView 1
    if(tableView == self.cTableLabel)
    {
        cell = [tableView dequeueReusableCellWithIdentifier:@"courseCell" forIndexPath:indexPath];
        NSLog(@"Here.");
        Course *courses = [self.course objectAtIndex:indexPath.row];
        cell.textLabel.text =courses.cName;
        cell.detailTextLabel.text =courses.cSchool;
        return cell;
    }
    //tableView 2
    if(tableView == self.jTableLabel)
    {
        if (indexPath.row == 0)
        {
            cell = [tableView dequeueReusableCellWithIdentifier:@"JobName" forIndexPath:indexPath];
            cell.textLabel.text = _jDetails.jName;
        }
        else if (indexPath.row == 1)
        {
            cell=  [tableView dequeueReusableCellWithIdentifier:@"JobEarnings" forIndexPath:indexPath];
            cell.textLabel.text  = @"Job Earnings (per month): Php";
            cell.detailTextLabel.text = _jDetails.jEarnings;
        }
        return cell;
    }
    return 0;

}

也可以在你的init中调用registerClass:[UITableViewCell class] forCellReuseIdentifier:,它只需要声明一次。

答案 1 :(得分:0)

出于性能原因,表视图的数据源通常应该在其tableView:cellForRowAtIndexPath:方法中将行分配给行时重用UITableViewCell对象。表视图维护数据源已标记为可重用的UITableViewCell对象的队列或列表。当要求为表视图提供新单元格时,请从数据源对象中调用此方法。如果现有单元格可用,则此方法会使现有单元格出列,或者使用先前注册的类或nib文件创建新单元格。如果没有单元可供重用,并且您没有注册类或nib文件,则此方法返回nil。

如果您为指定的标识符注册了类,并且必须创建新的单元格,则此方法通过调用其initWithStyle:reuseIdentifier:方法来初始化该单元格。对于基于nib的单元格,此方法从提供的nib文件加载单元格对象。如果现有单元可用于重用,则此方法将调用单元的prepareForReuse方法。

答案 2 :(得分:0)

您需要为每个tableview创建不同的单元格,尝试使用上面的代码:

 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
       static NSString *CellIdentifier = @"Cell";
        UITableViewCell *cell;
         //tableView 1  
         if(tableView == self.cTableLabel)
         {
     cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil)
        {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        }
        else
        {
            for(UIView *view in cell.contentView.subviews)
            {
                [view removeFromSuperview];
            }
        }
              NSLog(@"Here.");
              Course *courses = [self.course objectAtIndex:indexPath.row];
              cell.textLabel.text =courses.cName;
              cell.detailTextLabel.text =courses.cSchool;
              return cell;
         }
         //tableView 2
         if(tableView == self.jTableLabel)
         {
        cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil)
        {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        }
        else
        {
            for(UIView *view in cell.contentView.subviews)
            {
                [view removeFromSuperview];
            }
        }
              if (indexPath.row == 0)
              {
                   cell = [tableView dequeueReusableCellWithIdentifier:@"JobName"];
                   cell.textLabel.text = _jDetails.jName;
              }
              else if (indexPath.row == 1)
              {
                   cell=  [tableView dequeueReusableCellWithIdentifier:@"JobEarnings"];
                   cell.textLabel.text  = @"Job Earnings (per month): Php";
                   cell.detailTextLabel.text = _jDetails.jEarnings;
              }
              return cell;
         }
         return 0;

    }

答案 3 :(得分:0)

请交叉检查您的某个表是否在numberOfRowsInSection方法中返回更多行数。可能是您没有检查此方法,因为两个表都返回不同的行数。