Введение
В моем текущем приложении у меня есть UITableView, который содержит пользовательские объекты ячеек. Пользовательские объекты UIViewCellObject просто являются подклассами стандартного класса UITableViewCell. Пользовательские ячейки содержат информацию о запущенных фоновых загрузках и обновляют их с помощью таких вещей, как процент выполнения и т. д.
Пользовательские объекты ячейки прослушивают NSNotifications от процессов загрузки, работающих в фоновом режиме, и когда они получают соответствующее уведомление, они просто обновляют свои собственные элементы управления представлением новой информацией (например, процентом загрузки).
Теперь, когда процесс загрузки завершен, я переупорядочиваю массив активных объектов загрузки и перезагружаю табличное представление следующим образом:
-(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
Я действительно понятия не имею, что здесь происходит.
dataSource
вашего табличного представления? Кажется, что он установлен на экземплярCALayer
, когда он терпит неудачу. - person Johannes Fahrenkrug   schedule 18.02.2012markUploadAsFinished
в объектеApplicationActivities
. Это может стать или не стать проблемой в будущем, в зависимости от того, что делаетmarkUploadAsFinished
. - person herzbube   schedule 18.02.2012