使用tableview从视图控制器返回时应用程序崩溃

时间:2013-06-02 17:30:38

标签: ios objective-c tableview afnetworking

我有一个带有图像init的表视图的视图控制器。 我正在使用AFNetworking加载图像,有时(主要是当我的互联网连接速度很慢时),当我点击视图控制器中的backbuttonitem并进入rootviewcontroller时应用程序崩溃,我收到以下消息:

-[__NSCFDictionary numberOfSectionsInTableView:]: unrecognized selector sent to instance 0x1f567e30

为什么呢? 我正在使用ARC。 这是我加载图片的代码

if(item.thumb)
    {
        [cell.listItemImage setImage: item.thumb];

    }
    else
    {

        UIActivityIndicatorView *loadingSymbol = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle: UIActivityIndicatorViewStyleGray];
        loadingSymbol.frame = CGRectMake(0, 0, cell.listItemImage.frame.size.width, cell.listItemImage.frame.size.height);
        [cell.listItemImage addSubview: loadingSymbol];
        [loadingSymbol startAnimating];


        [cell.listItemImage setImageWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString: item.thumbUrl]]
                                  placeholderImage:[UIImage imageNamed:@"transparent.png"]
                                           success:^(NSURLRequest *request , NSHTTPURLResponse *response , UIImage *image )
        {

                item.thumb = image;
            [cell setNeedsLayout];
                [loadingSymbol removeFromSuperview];
               [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];

        }
        failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error)
        {
             NSLog(@"something went wrong wiv the images");
            NSLog(@"%@", error);
             //[loadingSymbol removeFromSuperview];

        }
         ];
    }
}

如果有人可以帮助我,我会很高兴的!

修改

解决了我的第一个问题。但是现在当我在我的桌面视图中滚动时应用程序崩溃了。我认为这与以下行有关:

[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];

任何想法为什么?

2 个答案:

答案 0 :(得分:0)

在视图控制器的dealloc方法中添加以下行。这在一个项目中对我有用。

[[UIImageView af_sharedImageRequestOperationQueue] cancelAllOperations];  

你的dealloc看起来像这样

-(void)dealloc
{
  [[UIImageView af_sharedImageRequestOperationQueue] cancelAllOperations];  

  //your other clean ups

  [super dealloc];
}

修改

在ViewController的头文件中,为UITableView

添加一个IBOutlet

IBOutlet UITableView *myTableView;

将您的UITableView从Interface Builder连接到该出口(myTableView)。

在你的dealloc

中将IBOutlet设置为nil
-(void)dealloc
{
   myTableView = nil;
   //your other clean ups
   [super dealloc];
}

您的成功区块应如下所示

success:^(NSURLRequest *request , NSHTTPURLResponse *response , UIImage *image )
        {
           if(myTableView)
           {
              item.thumb = image;
              [cell setNeedsLayout];
              [loadingSymbol removeFromSuperview];
             [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];
           }

        }

编辑2(滚动)

在您的成功阻止中,而不是:

[tableView reloadRowsAtIndexPaths:[NSArray arayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];

使用:

[tableView reloadRowsAtIndexPaths:[tableView indexPathsForVisibleRows] withRowAnimation:UITableViewRowAnimationNone];

答案 1 :(得分:0)

问题:视图控制器取消分配后,网络I / O会完成一段时间。由于网络I / O,您重新加载一些单元格。重新加载单元格会调用视图控制器(已取消分配)以获取dataSource信息和崩溃。

解决方案:您必须在dealloc中清除表视图委托和dataSource。

- (void)dealloc {
    // Cleanup table view 
    self.tableView.delegate = nil;
    self.tableView.dataSource = nil;

    // Stop network operations since their are not needed anymore.
    for (UITableViewCell *cell in [self.tableView visibleCells]) {
        [cell. listItemImage cancelImageRequestOperation];
    }
 }

在您的cellForRowAtIndexPath中,在重用之前取消图像下载:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"MyCellId";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    // Cancel network request
    [cell. listItemImage cancelImageRequestOperation];
    ...
}