4

https://stackoverflow.com/search?q=UITableView+dataSource+must+return+a+cell+from+tableView%3AcellForRowAtIndexPathで検索していますが、セルがnilかどうかを確認する必要があることはわかっていますが、私のセルカスタムであり、xib を使用していません。storyboard を使用しています。また、storyboard.as でクラス CustomPlaceTableViewCell を選択しています http://i.stack.imgur.com/g0rRO.png

コード:

- (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 dataSource は tableView:cellForRowAtIndexPath からセルを返す必要があります:'

4

5 に答える 5

4

tableView:cellForRowAtIndexPath の戻りセルを見逃していると思います これを試してください

return cell; 

ansはこれを確認または使用しますNSLog(@"description = %@",[cell description]);

[cell description]null の場合は変更します

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
}

この後、セルだけが nil にならず、アプリがクラッシュすることはありません。

これで問題が解決することを願っています

于 2012-07-02T09:50:56.330 に答える
-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 に答える