UITableView прокрутка сбой приложение - PullRequest
11 голосов
/ 14 июня 2009

Предисловие : Я новичок в iPhone SDK, Obj-C, Интерфейсном Разработчике и Какао. Я, вероятно, делаю что-то явно не так.

Вопрос : У меня есть UITableView, который падает, если я прокручиваю его. Он будет немного прокручиваться, чтобы показать полную ячейку самой нижней половины скрытой ячейки, но не будет загружать следующую. Точно так же, если я прокручиваю верхнюю часть, чтобы полностью скрыть самую нижнюю ячейку, и она резиновыми полосами возвращается, чтобы показать эту ячейку, она вылетит, прежде чем показывать ее. Это кажется мне странным, потому что правильно рисует первые 7 из 11 ячеек. Данные ячейки находятся в NSArray, в UITableViewController, связанном как dataSource и delegate для UITableView в Интерфейсном Разработчике. Работает при инициализации представления.

Я делаю приложение, которое, как я думал, я бы сделал 2 дня назад, просто вычисляет комбинации и отображает их список в удобном для меня виде таблицы прокрутки. Сейчас он даже не вычисляет все, NSArray в DataSource инициализируется один раз с некоторыми строками, такими как @"Hello" и @"World".

Шаги для воспроизведения : Поскольку я использую IB, я не могу точно показать вам полную историю в коде. Поэтому я опишу то, что я сделал до сих пор, и надеюсь, что это не заставит вас спать.

Сделал новое «Приложение панели вкладок» в XCode, потому что я хочу 2 вкладки, и я не хочу ни панель навигации, ни полноэкранную таблицу. Я переместил представление первой вкладки MainWindow.xib в FirstView.xib как аналог данного SecondView.xib. Это сработало хорошо. Я изменил представление так, чтобы оно содержало два UITextField s для ввода и UITableView для вывода. Это сработало, но стол был пуст. Я вложил в подкласс UITableViewController, где я заполнил свойство NSArray с именем combinations 11 строками, а затем добавил

// Set up the cell...
cell.userInteractionEnabled = NO;
cell.text = [combinations objectAtIndex:indexPath.row];

там, где был только комментарий. В IB я добавил Table View Controller к FirstView.xib и установил имя его класса, совпадающее с именем этого нового подкласса, и дважды перетащил Table View в моем виде на этот Combinations Table View Controller. Однажды связав dataSource и один раз delegate. Хотя я получаю такое же поведение, если только dataSource связан.

Запускается и заполняет видимые строки таблицы (6.5) первыми 7 значениями в dataSource combinations. Я могу прокрутить на 0,5 ячейки вниз, а затем вернуться обратно. Но если я прокручиваю более 0,5 клетки вверх или вниз, приложение вылетает. Объяснение в отчете гласит:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '*** -[NSCFTimer tableView:cellForRowAtIndexPath:]:
unrecognized selector sent to instance 0x52ca40'

Я не сделал NSCFTimer, и при этом я не связал его с моим Table View, я подозреваю, что cellForRowAtIndexPath - это именно то сообщение, которое должно было быть отправлено на мои dataSource или delegate, поэтому я ' Я смущен тем, почему он сбился с пути и куда он в итоге пошел.

Обновление : Спасибо за ответы и комментарии. Кажется, моя проблема заключается в том, что CombinationsTableViewController (подкласс UITableViewController) фактически не создается в каком-либо конкретном месте моего кода. Он создается как некоторое время (когда загружен FirstView.xib) и, по-видимому, управляется, пока начальный tableView заполнен 7 ячейками, а затем освобождается. Поэтому мне нужно определить, где / как сделать сохраненную ссылку на этот контроллер. У моего Application Delegate, вероятно, должна быть какая-то розетка с этим контроллером, которую можно связать как экземпляр, который находится в xib. Да, я новичок в этом. Я знаю, что мог бы просто устранить эти проблемы, избегая IB и делая вещи явно в коде, но я решил, что хочу научиться гибко использовать IB.

Наконец : Да, мне нужен был сохраненный экземпляр контроллера табличного представления. Звучит элементарно, но это не было понятно при работе с МБ, как у меня. Прочитайте мой собственный пост для всего процесса и исправьте.

В сторону : Либо отладчику нужны подробные инструкции (любые ссылки приветствуются), либо он работает не очень хорошо. Кажется, я получаю больше информации быстрее, позволяя приложению аварийно завершить работу и прочитав отчет, который он генерирует. Но это требует утомительного завершения, повторного запуска и 3 кликов. Я действительно хотел перейти от этого к подключению входных данных, выполнению расчетов и обновлению таблицы при каждом изменении. Это должно быть трудной частью, а не заставлять элемент фреймворка работать.

Дальнейшие разговоры : все это было в iPhone SDK для 2.2.1. В то время iPhone OS 3.0 без бета-версии еще не была доступна без вступления в клуб за холодные наличные. Я ожидал, что это будет на открытии WWDC 2009, но фактически сегодня (17 июля 2009 года) был выпущен бесплатный публичный 3.0 SDK.

Ответы [ 6 ]

7 голосов
/ 14 июня 2009

похоже, что вы теряете своего делегата tableView.

Похоже, что это происходит, когда UITableViewDelegate выпускается, и приложение затем использует тот же адрес указателя для NSCFTimer. Вы когда-нибудь вызывали release на своем удаленном компьютере, или вы не сохранили делегата, если он находится в пуле автоматического выпуска.

5 голосов
/ 15 июня 2009

Хорошо, если вы следовали инструкциям по воспроизведению, я добавлю шаги для решения этой проблемы:

Действия по устранению этой проблемы

  1. Подкласс UIViewController. Я назвал мой CombinationsViewController. В этом контроллере добавьте свойство как IBOutlet для combinationsTableViewController с шага 6 ниже.

  2. Не забудьте импортировать нужные вещи и синтезировать контроллер табличного представления, а также выпустить его методом dealloc.

  3. В FirstView.xib изменить класс File's Owner на этот последний подкласс.

  4. Свяжите свои комбинации розетки ViewController с Combinations Table View Controller в FirstView.xib, выполненном в шаге 7 ниже.

  5. Откройте TabBarController в MainWindow.xib, выберите первую вкладку и в Identity Inspector измените класс на последний подкласс (CombinationsViewController).

Это делает таблицу заполненной нормально и прокручивает материал.

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

Перечисленные шаги для воспроизведения в качестве ссылки на исправление:

  1. Сделано новое «Приложение панели вкладок» в Xcode.

  2. Открыл Tab View Controller, перетащил предварительно подготовленное представление для первой вкладки в MainWindow.xib

  3. Сделал новый xib на основе представления под названием FirstView.xib в качестве аналога данного SecondView.xib и поместил этот сборный вид в этот xib.

  4. Связал вид с File's Owner s view выходом.

  5. Я изменил представление так, чтобы оно содержало два UITextField s для входов и UITableView для вывода.

  6. Я подклассифицировал UITableViewController как CombinationsTableView, где я заполнил свойство NSArray с именем combinations 11 строками, а затем добавил код cell.text = [combinations objectAtIndex:indexPath.row];, где был только комментарий о настройке ячейка.

  7. В FirstView.xib я добавил Table View Controller и установил имя его класса, совпадающее с именем этого нового подкласса, и дважды перетащил Table View в моем представлении на этот Combinations Table View Controller. Однажды связав dataSource и один раз delegate.

В этот момент таблица выполняет рендеринг с данными, но прокрутка прерывается. Это потому, что CombinationTableView нигде не сохраняется. И это очень непонятно для первого пользователя IB. Поэтому вам нужно применить исправление, указанное выше.

Первый, кто подытожит это в своем ответе, отметит галочкой правильный ответ. НАПРИМЕР. Создайте подкласс viewController, который является владельцем файла FirstView.xib и содержит сохраненный IBOutlet, который вы можете связать с вашим контроллером табличного представления в том же файле xib.

4 голосов
/ 14 июня 2009

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

Все ячейки загружаются из метода источника данных:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

Я бы удостоверился, что вы явно задали делегат и источник данных tableView. Это можно сделать в коде или IB. по:

[self.tableView setDelegate:self];
[self.tableView setDataSource:self];

Также, как сказал Bluephlame, возможно, вы где-то выпускаете UITableVewController.

Чтобы узнать, установите точку останова внутри метода dealloc:

- (void)dealloc{


     //releasing things

     [super dealloc];
} 

Если вы отпустите его, вы достигнете этой точки останова. Тогда вы можете начать выслеживать преступника.

2 голосов
/ 09 сентября 2011

выделяет память для массива вместо [NSArray arrayWithObjects:];. Без выделения памяти он не будет перезагружать строки .... используйте array=[NSArray alloc] initWithObjects]; ... вместо вышеуказанного.

2 голосов
/ 15 июля 2011

У меня была та же проблема, и я исправил ее, добавив nil в массив как последний элемент.

Это сбой для этого:

pairs = [[NSArray alloc] initWithObjects:@"EUR/USD",@"USD/JPY",@"GBP/USD",@"USD/CHF",@"USD/CAD"];

но не для этого:

pairs = [[NSArray alloc] initWithObjects:@"EUR/USD",@"USD/JPY",@"GBP/USD",@"USD/CHF",@"USD/CAD",nil];

Надеюсь, это поможет.

0 голосов
/ 09 февраля 2010

У меня была такая же проблема. У меня был подкласс UITableViewController в nib-файле, но я только объявил UITableView как выход / свойство, которое UITableViewController для таблицы было выпущено, пока еще используется. 1005 *

Быстрое решение состояло в том, чтобы просто добавить выход к классу Владельца файла, который ссылался на встроенный UITableViewController.

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