4

我在https://stackoverflow.com/search?q=UITableView+dataSource+must+return+a+cell+from+tableView%3AcellForRowAtIndexPath进行了搜索,但我知道我需要检查单元格是否为零,但我的单元格是自定义的,我不使用 xib,我使用故事板。我也在 storyboard.as http://i.stack.imgur.com/g0rRO.png上选择类 CustomPlaceTableViewCell

代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
CustomPlaceTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    //if ([cell isKindOfClass:[CustomPlaceTableViewCell class]]) { cell = (CustomPlaceTableViewCell *)cell; }
//retrieve the place info
Place *place = [self.placeDataController objectInPlaceListAtIndex:indexPath.row];

//set the cell with place info
if (place.name)
{
    cell.nameLabel.text =place.name;
}
else
{
    cell.nameLabel.text = @"PortAura";
}

 if (place.distance)
{
    cell.distanceLabel.text = place.distance;    
}
else
{
    cell.distanceLabel.text = @"PortAura";
}



 return cell;

}


CustomPlaceTableViewCell.m
@interface CustomPlaceTableViewCell : UITableViewCell{
  UILabel *nameLabel;
  UILabel *distanceLabel;
  UILabel *addressLabel;
}
@property (nonatomic) IBOutlet UILabel *nameLabel;
@property (nonatomic) IBOutlet UILabel *distanceLabel;
@property (nonatomic) IBOutlet UILabel *addressLabel;
 @end


   @implementation CustomPlaceTableViewCell
   @synthesize distanceLabel,nameLabel,addressLabel;

  - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
 {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
    // Initialization code
  }
 return self;
}

 - (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
  [super setSelected:selected animated:animated];

  // Configure the view for the selected state
 }

 @end

当我运行我的应用程序时,它给了我:

2012-07-02 17:16:26.675 MyAura[2595:707] *** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“UITableView 数据源必须从 tableView:cellForRowAtIndexPath 返回一个单元格:”

4

5 回答 5

4

我想你错过了 tableView:cellForRowAtIndexPath 中的返回单元格试试这个

return cell; 

ans检查或使用这个NSLog(@"description = %@",[cell description]);

如果[cell description]为空,则更改它

CustomPlaceTableViewCell *cell = (CustomPlaceTableViewCell*) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
于 2012-07-02T09:33:24.820 回答
2

是的,即使您使用了上述所有建议,您的代码也会崩溃。您是否检查过您的单元格实际上是在创建的?

不,这没有被创建,这个方法实际上是在返回一个nil值。

在您的代码中使用以下行试图使用可重用单元但如果没有创建单元怎么办?

CustomPlaceTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

你必须在你的代码之后检查这个:

if (cell == nil) {
     cell = [[CustomPlaceTableViewCell alloc] init]; // or your custom initialization
}

在此之后,只有您的单元格不会为零,并且应用程序不会崩溃。

希望这能解决您的问题

于 2012-07-02T09:50:56.330 回答
0

我也面临同样的问题,但我解决了。

我正面临这个问题,因为我在单独的 Xib 文件中创建了我的 talbeViewCell,并将我的 tableview 类作为文件的所有者。但是,我还没有将我的单元格 IBOutlet 链接到我的 tableview 类。

因此,将我的 tableviewcell Xib 链接到在我的 tableview 中创建的 IBOutlet,我解决了这个问题。

您将遇到此问题,因为您在 cellforRowAtIndex 中创建的 tableviewcell 为 nil。

于 2015-10-03T18:50:31.280 回答
-1

return cell; 最后不见了

于 2012-07-02T09:29:26.310 回答
-1

首先我使用:

    PlaceMasterViewController *placeController = [[PlaceMasterViewController alloc]init];
    [self.navigationController pushViewController:placeController animated:YES];

导致我表中没有数据,或者给我错误,所以我使用了:

  UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard"
                                                             bundle: nil];

    PlaceMasterViewController *placeController = (PlaceMasterViewController*)[mainStoryboard 
                                                       instantiateViewControllerWithIdentifier: @"peoplemastViewControl"];
    [self.navigationController pushViewController:placeController animated:YES];

一切都好

于 2012-07-03T01:15:05.353 回答