Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/110.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用tableview从视图控制器返回时应用程序崩溃_Ios_Objective C_Tableview_Afnetworking - Fatal编程技术网

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

Ios 使用tableview从视图控制器返回时应用程序崩溃,ios,objective-c,tableview,afnetworking,Ios,Objective C,Tableview,Afnetworking,我有一个视图控制器,带有带有images init的表视图。 我正在使用AFNetworking加载图像,有时(主要是当我的internet连接很慢时),当我单击view controller中的Backbuttonie并进入rootviewcontroller时,应用程序崩溃,我收到以下消息: -[__NSCFDictionary numberOfSectionsInTableView:]: unrecognized selector sent to instance 0x1f567e30

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

-[__NSCFDictionary numberOfSectionsInTableView:]: unrecognized selector sent to instance 0x1f567e30
为什么?? 我在用弧。 这是我加载图像的代码

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];

你知道为什么吗

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

[[UIImageView af_sharedImageRequestOperationQueue] cancelAllOperations];  
您的dealloc将看起来像这样

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

  //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];
           }

        }
编辑 在ViewController的头文件中,为UITableView添加IBOutlet

ibuitableview*myTableView

从Interface Builder将您的
UITableView
连接到该插座(
myTableView

在dealloc中将IBOutlet设置为零

-(void)dealloc
{
   myTableView = nil;
   //your other clean ups
   [super dealloc];
}
您的成功块应该如下所示

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

  //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];
使用:


问题:视图控制器解除分配后,网络I/O将在一段时间内完成。网络I/O的结果是重新加载一些单元格。重新加载单元格会调用视图控制器(解除分配)以获取数据源信息和崩溃

解决方案:必须在dealloc中取消表视图委托和数据源

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

根据错误消息,您设法将NSDictionaryObject分配给框架需要表委托的某个属性。因此,当表视图控制器已释放但后台仍加载数据时,会发生这种情况。很显然,您保留了对不应再存在的单元格对象的引用。单元格本身可能仍然存在,因为这取决于它是强引用还是弱引用。我不确定。“[cell setNeedsLayout]”是否会导致单元格和表被重新绘制,而表或其控制器不再存在?但是,您应该找到一些更聪明的解决方案。返回时取消所有打开的请求,或者在相关视图不可见/不存在时不再处理数据。嗯,我返回时如何取消打开的请求?您是否使用
UIImageView+AFNetworking
?谢谢,但是当我按照您所说的做时,我得到了以下错误:选择器af_sharedImageRequestOperationQueue没有已知的类方法?您是否在视图控制器文件中放入了
#import“UIImageView+AFNetworking.h”
?(包括.h文件)这很奇怪,因为最新版本的库中有这种方法。(参考源代码…)我将编辑答案并添加另一个解决方法(不要将列表格式与源格式混合。因此会把它搞砸。)嗯,等等,现在滚动tableview时它会崩溃??我也这么做了,但现在上下滚动时我的应用程序会崩溃。当internet连接缓慢时发生。知道为什么吗?我正在使用UIImageView+AFNetworking,我认为我使用它的方式是正确的。。我也收到了这条消息,不知道它是什么意思:purgeIdleCellConnections:find one to purge conn=0x1D5BB9A0您可以发布您的滚动崩溃吗?你在帖子中提到的崩溃与dealloc未滚动有关。编辑了我的问题,我不知道你想让我发布哪段代码?当我滚动“是”时,应用程序崩溃了,但我认为这与AFNetworking有关,因为我有一个没有图像的tableview,工作正常。