iOS - Получение странной ошибки: нераспознанный селектор отправляется экземпляру в UITableView - PullRequest
4 голосов
/ 18 февраля 2012

Введение

В моем текущем приложении у меня есть UITableView, который содержит пользовательские объекты ячеек.Пользовательские объекты UIViewCellObject просто наследуются от стандартного класса UITableViewCell.Пользовательские ячейки содержат информацию о выполнении фоновых загрузок и обновляют их, например, процент выполненных операций и т. Д.

Пользовательские объекты ячеек прослушивают NSNotification от процессов загрузки, выполняющихся в фоновом режиме, и когда они получают соответствующее уведомлениеони просто обновляют свои собственные элементы управления представлением новой информацией (такой как процент загрузки).

Теперь, когда процесс загрузки завершен, я переупорядочиваю массив активных объектов загрузки и перезагружаю табличное представление следующим образом:

-(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

Я действительно понятия не имею, что здесь происходит.

Ответы [ 2 ]

6 голосов
/ 18 февраля 2012

'- [CALayer tableView: numberOfRowsInSection:]: нераспознанный селектор отправлен на экземпляр

У вас неверный указатель.Похоже, что источник данных вашей таблицы освобождается, пока таблица еще существует.Таблица не сохраняет свой источник данных, потому что это может создать цикл сохранения.Если вы не позаботитесь о том, чтобы хранить источник данных, пока таблица его использует, таблица может получить указатель на объект, который больше не существует.В этом случае похоже, что объект CALayer впоследствии создается по тому же адресу.Когда таблица позже отправляет своему «источнику данных» сообщение, чтобы получить количество строк, это сообщение доставляется слою, который (очевидно) не имеет метода -tableView:numberOfRowsInSection:, и возникает ошибка.

0 голосов
/ 18 февраля 2012

По моему мнению, вы используете метод процесса загрузки в фоновом режиме, я думаю, что другой поток, чем основной поток. И, насколько мне известно, когда вы имеете дело с объектами UIKIT, у вас все рушится в главном потоке.

Но эти проблемы возникают не каждый раз, потому что когда-то вы переключаетесь на другой поток на основной поток, поэтому он работает нормально, а иногда нет. так что проблема возникает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...