Ошибка утверждения в -[NSIndexPath row] с AppList dataSource

См. обновление ниже.

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

SpringBoard[1622] <Warning>: *** Assertion failure in -[NSIndexPath row], /SourceCache/UIKit/UIKit-2380.17/UITableViewSupport.m:2680 SpringBoard[1622] <Warning>: ***** AltKeyboard Uncaught Exception: Invalid index path for use with UITableView. Index paths passed to table view must contain exactly two indices specifying the section and row. Please use the category on NSIndexPath in UITableView.h if possible. *****
or
SpringBoard[1890] <Warning>: ***** AltKeyboard Uncaught Exception: *** -[__NSArrayM objectAtIndex:]: index 2 beyond bounds [0 .. 1] ***** SpringBoard[1890] <Error>: *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 2 beyond bounds [0 .. 1]' *** First throw call stack:

Если dataSource не определен и я использую поддельные данные (имя теста), таблица создается нормально. Когда я печатаю источник данных, в нем есть только два элемента.

Райан Петрич в IRC, казалось, предположил, что я все делаю совершенно неправильно, но после этого мало чем помог. Может быть, я неправильно решаю эту задачу?

Код: http://pastebin.ca/2457626
Репозиторий: https://github.com/twodayslate/ListLauncher

изменить/обновить! dataSource вызывает у меня проблемы. Он не извлекает одинаковое количество приложений, и поэтому я получаю ошибки индекса и тому подобное. У меня более 200 приложений, но dataSource извлекает только 2.
Следующий код не выдает ошибок, а отображает только 2 элемента: http://pastebin.ca/2458961

редактировать! Я изменил его, поэтому я просто использую ALApplicationList. Я могу получить все перечисленные приложения. Однако, когда я пытаюсь прокрутить таблицу, она вылетает. Сортировка и создание списка очень медленные, поэтому я считаю, что это может быть причиной проблемы. Я не профессионал в obj-c, поэтому я уверен, что есть лучший способ, чем то, что я делаю. http://pastebin.ca/2459318


person twodayslate    schedule 24.09.2013    source источник
comment
возможный дубликат Не удается заставить работать deleteRowsAtIndexPaths. Ответ там применим к этому вопросу, поскольку основная причина исключения идентична.   -  person CodaFi    schedule 24.09.2013
comment
Я никогда не создаю NSIndexPath, поэтому я считаю, что это отличается от приведенного выше решения.   -  person twodayslate    schedule 24.09.2013
comment
Не будь так в этом уверен. Строка 164 в ссылке pastebin кажется мне подозрительной.   -  person CodaFi    schedule 24.09.2013
comment
Замена строки 164 на NSIndexPath *indexPath = [NSIndexPath indexPathForRow:1 inSection:s]; по-прежнему дает мне pastebin.ca/2457632   -  person twodayslate    schedule 24.09.2013
comment
Хорошо, теперь исправьте ваш доступ к массиву с небольшой проверкой границ.   -  person CodaFi    schedule 24.09.2013
comment
На моем устройстве установлено 237 приложений. dataSource, кажется, имеет только две вещи. Вот почему это дало бы мне эту ошибку. Он пытается найти приложения 3-237, но dataSource не справляется. Верно?   -  person twodayslate    schedule 24.09.2013
comment
Включено обновление и награда.   -  person twodayslate    schedule 27.09.2013
comment
Ответь на вопрос, и я дам тебе награду @CodaFi. То, что вы прокомментировали, помогло мне.   -  person twodayslate    schedule 02.10.2013
comment
Хорошо, там. Спасибо за предложение.   -  person CodaFi    schedule 02.10.2013


Ответы (2)


Ваша проблема двояка. Во-первых, UITableView ожидает, что ему будут переданы пути индекса, содержащие как строку, так и раздел, где вы предоставили ему только строку. Во-вторых, вы не можете ожидать, что непроверенный доступ к массиву будет успешным в 100% случаев, поэтому границы проверяют любые вызовы доступа, которые вы можете использовать. Также не мешало бы использовать некоторые сохранения в назначениях iVar, которые у вас есть в вашем коде, если только вам не нужно хранить ссылку на него (но похоже, что вам это нужно).

person CodaFi    schedule 02.10.2013

Я нашел альтернативное решение для ALDataSource. Я отсортировал ALApplicationList.applications. Проблема заключалась в том, что экземпляр отсортированного NSArray продолжал исчезать. Так что я сделал [значения сохраняются], и все заработало! Повторная инициализация отсортированных значений была слишком медленной и приводила к сбою устройства.

Вот рабочий код, который успешно выводит список всех приложений: http://pastebin.ca/2459778

person twodayslate    schedule 29.09.2013