4

介绍

在我当前的应用程序中,我有一个 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:]: unrecognized selector sent to instance

我不是一直都明白,有时整个过程运行良好,完成的上传出现在 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

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

4

2 回答 2

6

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

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

于 2012-02-18T06:32:14.490 回答
0

据我说,你在后台运行上传过程方法我认为主线程以外的其他线程。据我所知,当你处理 UIKIT 对象时,你在主线程上已经毁了。

但是这些问题并非每次都会发生,因为有时您将其他线程切换到主线程,因此它工作正常,有时则不行。所以出现问题

于 2012-02-18T04:35:18.067 回答