web-dev-qa-db-fra.com

Échec d'assertion dans UITableViewController

Je prends la classe iOS U Stanford iTunes et je travaille sur l'une des tâches pour créer une petite application Flickr. Je reçois une erreur que je n'arrive pas à résoudre le problème et qui apparaît comme 

* Échec de l'assertion dans - [UITableView _configureCellForDisplay: forIndexPath:], /SourceCache/UIKit_Sim/UIKit-2280.1/UITableView.m:5336 2012-08-03 10: 59: 24.596 Affectation 4 [4611: c07] (null) libc ++ abi.dylib: terminate appelé lancer une exception

Mon code pour le contrôleur tableview en question:

#import "PlacesPhotosTableViewController.h"

@interface PlacesPhotosTableViewController ()
@property (nonatomic) NSDictionary *placeToDisplay;
@property (nonatomic) NSArray *photosInPlace;
@end

@implementation PlacesPhotosTableViewController
@synthesize placeToDisplay = _placeToDisplay;
@synthesize photosInPlace = _photosInPlace;

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (id)init
{
    self = [super init];

    return self;
}

- (id)initWithPlace:(NSDictionary *)place
{
    self = [self init];
    if (self)
    {
        self.placeToDisplay = place;
    }

    return self;
}

- (NSArray *)photosInPlace
{
    if (_photosInPlace == nil)
    {
        _photosInPlace = [FlickrFetcher photosInPlace:self.placeToDisplay maxResults:50];
    }

    return _photosInPlace;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog([self.placeToDisplay valueForKeyPath:@"description._content"]);

    // Uncomment the following line to preserve selection between presentations.
    // self.clearsSelectionOnViewWillAppear = NO;

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem;
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

#pragma mark - Table view data source


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
#warning Incomplete method implementation.
    // Return the number of rows in the section.
    return [self.photosInPlace count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Photos";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    NSString *string = [[self.photosInPlace objectAtIndex:indexPath.row] valueForKeyPath:@"description._content"];

    cell.textLabel.text = string;

    return cell;
}
26
gsapienza

CellIdentifier Je parie que votre cellForRowAtIndexPath renvoie nil.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath     *)indexPath
{
    static NSString *CellIdentifier = @"Photos";

    /** NOTE: This method can return nil so you need to account for that in code */
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    // NOTE: Add some code like this to create a new cell if there are none to reuse
    if(cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

    }

    NSString *string = [[self.photosInPlace objectAtIndex:indexPath.row]     valueForKeyPath:@"description._content"];

    cell.textLabel.text = string;

    return cell;
}

C'est probablement la raison pour laquelle [UITableView _configureCellForDisplay:forIndexPath:] échoue ... parce que cellForRowAtIndexPath renvoie une valeur null et que configureCellForDisplay attend une UITableViewCell.

66
jerrylroberts

J'ai fait face au même problème et je l'ai résolu car j'ai oublié d'ajouter 

return cell;

maintenant c'est résolu.

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

    if(tableView==notiTblView){

        NSLog(@"TABLE NEW");

        static NSString *cellIdentifier = @"MenuCell";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
        UIImageView *imageview;
        UILabel *label;
        UILabel *lblDetail;

        if(cell == nil)
        {

            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault   reuseIdentifier:cellIdentifier];
            imageview=[[UIImageView alloc]initWithFrame:CGRectMake(8, 3,30, 37)];
            label=[[UILabel alloc]initWithFrame:CGRectMake(70, 10, 100, 20)];
            lblDetail=[[UILabel alloc]initWithFrame:CGRectMake(70, 35, 100, 30)];
            lblDetail.numberOfLines=3;

            imageview.tag=100;
            label.tag=101;
            lblDetail.tag=102;

            label.textColor=[UIColor blackColor];
            label.font=[UIFont systemFontOfSize:15];
            label.backgroundColor=[UIColor clearColor];

            lblDetail.textColor=[UIColor grayColor];
            lblDetail.font=[UIFont systemFontOfSize:13];
            lblDetail.backgroundColor=[UIColor clearColor];


            [cell.contentView addSubview:imageview];
            [cell.contentView addSubview:label];
            [cell.contentView addSubview:lblDetail];

        }

        cell.selectionStyle=UITableViewCellSelectionStyleNone;
        UIImageView *img=(UIImageView *)[cell.contentView viewWithTag:100];
        UILabel *lbl=(UILabel *)[cell.contentView viewWithTag:101];

        NSString * stirngId = [NSString stringWithFormat:@"%@",[[notificationARRAY objectAtIndex:indexPath.row]objectForKey:@"photoID"]];

        if ([dicImages_msg valueForKey:[[notificationARRAY objectAtIndex:indexPath.row] valueForKey:@"productName"]]) {

            img.image=[dicImages_msg valueForKey:[[notificationARRAY objectAtIndex:indexPath.row] valueForKey:@"productName"]];

        }
        else
        {
            if (!isDragging_msg && !isDecliring_msg)
            {
                [dicImages_msg setObject:[UIImage imageNamed:@"timthumb.jpg"] forKey:[[notificationARRAY objectAtIndex:indexPath.row] valueForKey:@"productName"]];
                [self performSelectorInBackground:@selector(download_Noti_image:) withObject:indexPath];
            }
            else
            {
                img.image=[UIImage imageNamed:@"timthumb.jpg"];
            }
        }

        lbl.text=[[notificationARRAY objectAtIndex:indexPath.row] objectForKey:@"memberName"];
        lbl.text=[[notificationARRAY objectAtIndex:indexPath.row] objectForKey:@"memberName"];

        return cell;

       /* static NSString *MyIdentifier = @"MyIdentifier";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
        if (cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier] ;
            cell.selectionStyle=UITableViewCellSelectionStyleNone;
            }
        cell.textLabel.text=[[notificationARRAY objectAtIndex:indexPath.row] objectForKey:@"memberName"];
        return cell;*/

   }else{
       static NSString *cellIdentifier = @"MenuCell";
       TblCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
       if (cell==nil) {
           cell = [[TblCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
            }

       NSLog(@"arr..in table..%@",PostedItem);
       cell.selectionStyle=UITableViewCellSelectionStyleNone;

       if([[[PostedItem objectAtIndex:indexPath.row] valueForKey:@"productType"] isEqualToString :@"Video"]){
           cell.postedimage.image=[UIImage imageNamed:@"play_icon.png"];
       }else{

           if ([dicImages_msg valueForKey:[[PostedItem objectAtIndex:indexPath.row] valueForKey:@"productName"]]) {

               cell.postedimage.image=[dicImages_msg valueForKey:[[PostedItem objectAtIndex:indexPath.row] valueForKey:@"productName"]];

           }else
            {
                if (!isDragging_msg && !isDecliring_msg)
                    {
                        [dicImages_msg setObject:[UIImage imageNamed:@"timthumb.jpg"] forKey:[[PostedItem objectAtIndex:indexPath.row] valueForKey:@"productName"]];
                        [self performSelectorInBackground:@selector(downloadImage_3:) withObject:indexPath];
                    } else
                        {
                            cell.postedimage.image=[UIImage imageNamed:@"timthumb.jpg"];
                        }
            }

       }
//*******************User image
    if ([dic_usrImg valueForKey:[[PostedItem objectAtIndex:indexPath.row] valueForKey:@"thumbUrl"]]) {

        cell.profileImage.image=[dic_usrImg valueForKey:[[PostedItem objectAtIndex:indexPath.row] valueForKey:@"thumbUrl"]];

    }
    else
    {
        if (!isDragging_msg && !isDecliring_msg)
        {
            [dic_usrImg setObject:[UIImage imageNamed:@"timthumb.jpg"] forKey:[[PostedItem objectAtIndex:indexPath.row] valueForKey:@"thumbUrl"]];
            [self performSelectorInBackground:@selector(downloadImage_IMAGE4:) withObject:indexPath];
        }
        else
        {
            cell.profileImage.image=[UIImage imageNamed:@"timthumb.jpg"];
        }
    }
//********************************
    [cell.btnImage setTag:100000+indexPath.row];
    [cell.btnImage  addTarget:self action:@selector(Shopw_feedImg:) forControlEvents:UIControlEventTouchUpInside];
//***************
    cell.postedimage.tag=indexPath.row;
    [cell.postedimage setUserInteractionEnabled:YES];
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onImageClick:)];
    [tap setNumberOfTouchesRequired:1];
    [tap setNumberOfTapsRequired:1];
    [tap setDelegate:self];
    [cell.postedimage addGestureRecognizer:tap];
    cell.membername.text=[[PostedItem objectAtIndex:indexPath.row] objectForKey:@"userName"];
    [cell.membername sizeToFit];
    //[[PostedItem objectAtIndex:indexPath.row] objectForKey:@"memberID"];  
    cell.productName.text= [[PostedItem objectAtIndex:indexPath.row]objectForKey:@"photoTitle"];
    //@"hello this is a test doviumbmvbhdf asx";
   // with new sffhy dgftn tun dgh ";
  //  NSLog(@"Str Length...%d",[cell.productName.text length]);
    if ([cell.productName.text length]>38) {

        NSLog(@"greater then...%@",cell.productName.text);
         cell.productName.numberOfLines=2;
        CGRect frame=cell.postedimage.frame;
        frame.Origin.y=130;
        cell.postedimage.frame=frame;
        CGRect Prdctframe=cell.productName.frame;
        frame.size.height=40.0f;
        cell.productName.frame=Prdctframe;
        //cell.postedimage.frame.Origin.y=115.0f;
    }//[[PostedItem objectAtIndex:indexPath.row]objectForKey:@"photoTitle"];
      //@"szfgfgbjmghufho stdogb ryt;o esftesi rdetg ry ry ry ";//
    else
    {
        cell.productName.numberOfLines=1;
        CGRect frame=cell.postedimage.frame;
        frame.Origin.y=110;
        cell.postedimage.frame=frame;
        CGRect Prdctframe=cell.productName.frame;
        Prdctframe.size.height=20.0f;
        cell.productName.frame=Prdctframe;
          NSLog(@"less then...");
    }

    //[cell.productName sizeToFit];
 //   cell.profileImage.image=[UIImage imageNamed:@"timthumb.jpg"];
    return cell;
   }

}
2
mahendra

Cette ligne ici

static NSString *CellIdentifier = @"Photos";

Cela correspond-il à l'identifiant de la cellule dans votre storyboard? J'ai trouvé que ceux-ci ne correspondaient pas était la cause du problème pour moi!

2
Matt Rees

Vous ne créez pas de cellule dans la méthode

tableView:cellForRowAtIndexPath:

Vous ne réutilisez que la cellule de cette méthode qui renvoie nil initialement.

Vous devez créer une cellule par le code ci-dessous dans votre méthode.

if(cell==nil){

    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
reuseIdentifier:CellIdentifier] autorelease];

}
0
Baalu