iOS – 得到一个奇怪的错误:无法识别的选择器发送到UITableView上的实例

介绍

在我目前的应用程序中,我有一个UITableView,它包含自定义单元格对象。 自定义UIViewCellObjects只是标准UITableViewCell类的子类。 自定义单元格保存有关运行后台上载的信息,并使用百分比完成等操作更新它们。

自定义单元格对象从后台运行的上载进程中侦听NSNotifications,当它们收到相关通知时,它们只是使用新信息(例如上载百分比)更新自己的视图控件。

现在,当上传过程完成后,我重新排序活动上传对象数组并重新加载tableview,如下所示:

-(void) uploadFinished: (NSNotification*)notification { NSDictionary *userInfo = [notification userInfo]; NSNumber *uploadID = [userInfo valueForKey:@"uploadID"]; if (uploadID.integerValue == uploadActivity.uploadID) { [[ApplicationActivities getSharedActivities] markUploadAsFinished:uploadActivity]; [parentTable reloadData]; [self setUploadComplete]; } } 

现在这个方法发生在tableviewcell对象中,正如你所看到的,他们调用自己的UITableView来在数组排序后立即重新加载数据。 markUploadAsFinished方法只是重新排序数组,因此任何新完成的上传都放在顶部,因此它将以这种方式出现在UITableView中。

问题

现在我遇到的问题是,当调用此方法时,我有时会收到以下错误: ‘NSInvalidArgumentException’,原因:’ – [CALayer tableView:numberOfRowsInSection:]:无法识别的选择器发送到实例

我不是总是得到它,有时整个过程运行良好,完成的上传出现在UItableview的开头,而在其他看似随机的时间失败。 我真的不知道这里发生了什么。

自定义单元格从.NIB文件加载,如下所示:

  UploadCell *cell = [activeUploadsTable dequeueReusableCellWithIdentifier:@"UploadProgressCell"]; if (cell == nil) { [[NSBundle mainBundle] loadNibNamed:@"UploadCellView" owner:self options:nil]; cell = customCell; } 

是否有人可能对这里发生的事情有所了解?

编辑

首先,我已经跟踪了这个错误,出现在以下行:reloadData

在自定义单元格对象内部调用。

此外,似乎它发送方法的实例可以改变。 我也遇到了这个错误:

 'NSInvalidArgumentException', reason: '-[UIScrollViewPanGestureRecognizer tableView:numberOfRowsInSection:]: unrecognized selector sent to instance 

我真的不知道这里发生了什么。

‘ – [CALayer tableView:numberOfRowsInSection:]:发送到实例的无法识别的选择器

你的指针很糟糕。 看起来您的表的数据源在表仍然存在时被释放。 该表不保留其数据源,因为这可能会创建保留周期。 如果在表使用数据源时不小心保留数据源,则表可以使用指向不再存在的对象的指针。 在这种情况下,看起来随后在同一地址创建了CALayer对象。 当表稍后向其“数据源”发送一条消息以获取行数时,该消息将传递给该层,这显然没有-tableView:numberOfRowsInSection:方法,并且会产生错误结果。

据我说你在后台运行上传进程方法我认为其他线程比主线程。 根据我的知识,当你处理UIKIT对象时,你已经破坏了主线程。

但是这些问题不是每次都会发生的,因为有些时候你切换到其他线程到主线程,所以它的工作正常,有些时候没有。 这样就会出现问题