【问题标题】:Assertion Failure in UITableViewControllerUITableViewController 中的断言失败
【发布时间】:2012-08-01 15:54:32
【问题描述】:

我正在参加 iTunes U 斯坦福 iOS 课程,并且正在完成一项任务,即构建一个小的 Flickr 应用程序。我收到一个我似乎无法调试的错误,它显示为

* -[UITableView _configureCellForDisplay:forIndexPath:] 中的断言失败,/SourceCache/UIKit_Sim/UIKit-2280.1/UITableView.m:5336 2012-08-03 10:59:24.596 分配 4[4611:c07] (null) libc++abi.dylib: 终止 称为抛出异常

我的表格视图控制器代码:

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

【问题讨论】:

标签: ios uitableview flickr


【解决方案1】:

我遇到了同样的问题并解决它,因为我忘了添加

return cell;

现在解决了。

- (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】:

    CellIdentifier 我敢打赌你的cellForRowAtIndexPath 会返回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;
    }
    

    这可能是[UITableView _configureCellForDisplay:forIndexPath:] 失败的原因...因为cellForRowAtIndexPath 返回一个空值,然后configureCellForDisplay 期待UITableViewCell

    【讨论】:

    • 成功了!出于好奇,为什么一个单元格会为空?
    • 一个简单的例子是当它试图渲染第一个单元格时。没有创建 UITableViewCell,因此没有可重用的。
    • 奇怪的是我不必为我拥有的另一张桌子这样做
    • 如果没有具有该标识符的可重用单元格,则该单元格为零。如果您没有在界面构建器中定义这样一个单元格并且没有从代码创建一个单元格(目前),就会发生这种情况。
    【解决方案3】:

    您不是在方法中创建单元格

    tableView:cellForRowAtIndexPath:
    

    您只能重用此方法中最初返回 nil 的单元格。

    您必须通过以下给定代码在您的方法中创建单元格。

    if(cell==nil){
    
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
    reuseIdentifier:CellIdentifier] autorelease];
    
    }
    

    【讨论】:

      【解决方案4】:

      这一行在这里

      static NSString *CellIdentifier = @"Photos";
      

      这是否与故事板中的单元格标识符匹配?我发现这些不匹配是我遇到问题的原因!

      【讨论】:

        猜你喜欢
        • 2012-12-21
        • 2011-05-27
        • 2017-08-07
        • 2015-09-01
        • 2012-09-26
        • 2015-09-26
        相关资源
        最近更新 更多