我有一个带有图像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];
任何想法为什么?
答案 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];
}
}
在您的成功阻止中,而不是:
[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];
...
}