2012-08-03 27 views
25

Estoy tomando la clase de iOS U Stanford iOS y estoy trabajando en una de las asignaciones para construir una pequeña aplicación de Flickr. Recibo un error que me parece que no puede ser capaz de depurar el cual aparece comoFallo de aserción en UITableViewController

* error de aserción en - [UITableView _configureCellForDisplay: forIndexPath:], /SourceCache/UIKit_Sim/UIKit-2280.1/UITableView. m: 5336 2012-08-03 10: 59: 24.596 Asignación 4 [4611: c07] (null) libC++ abi.dylib: terminar llamado lanzar una excepción

Mi código para el tableviewcontroller en cuestión :

#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; 
} 
+0

Consulte también registrar su identificador de la celda. http://stackoverflow.com/questions/15813498/custom-table-cell-reuse-dequeue – Temporaneous

Respuesta

65

CellIdentifier Apuesto a que cellForRowAtIndexPath está retornando 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; 
} 

Probablemente por eso [UITableView _configureCellForDisplay:forIndexPath:] está fallando ... porque cellForRowAtIndexPath devuelve un valor nulo y luego configureCellForDisplay está esperando un UITableViewCell.

+0

¡Eso funcionó! Por curiosidad, ¿por qué una celda sería nula alguna vez? – gsapienza

+0

Un ejemplo simple sería cuando intenta renderizar la primera celda. No se han creado UITableViewCells, por lo que no hay que volver a utilizar. – jerrylroberts

+1

impar considerando que no tuve que hacerlo para la otra tabla que tengo – gsapienza

2

Esta línea aquí

static NSString *CellIdentifier = @"Photos"; 

¿Tiene este partido el identificador de celda en el guión gráfico? ¡Descubrí que no coincidir era la causa del problema para mí!

0

no está creando celular en el método

tableView:cellForRowAtIndexPath: 

Sólo la reutilización de la célula de este método que devuelve nil inicialmente.

Tiene que crear una celda con este código dado a continuación en su método.

if(cell==nil){ 

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

} 
2

que enfrentan el mismo problema y resolverlo porque yo olvidó añadir

return cell; 

ahora es resuelto.

- (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; 
    } 

}