Статическая ячейка из Nib-файла не отображается - PullRequest
0 голосов
/ 16 июля 2010

У меня есть Nib-файл, содержащий сгруппированное табличное представление и ячейку. Ячейка подключена к UITableViewController через розетку. В cellForRowAtIndexPath я просто возвращаю эту ячейку и вижу одну ячейку в табличном представлении. Но когда я изменяю количество строк таблицы на 2 и хочу показать одну и ту же ячейку, то я вижу только одну, кажется, что вторая ячейка должна быть там, поскольку нижние углы видимой ячейки не округлены однако его там нет.

Если я создаю второй объект ячейки в nib-файле, второй выход и возвращаю его в качестве второго ряда, он выглядит нормально. Моя ячейка имеет идентификатор, указанный в IB.

Означает ли это, что я не могу повторно использовать объект ячейки для более чем одной строки?

Ответы [ 2 ]

1 голос
/ 16 июля 2010

Точно так же, как вам потребуется один экземпляр UIButton для каждой видимой кнопки в вашем представлении, вам понадобится один экземпляр вашей ячейки для каждой видимой строки.

Обычный шаблон для управления этим - запросить у таблицы ранее созданную ранее ячейку, которая больше не нужна (dequeueReusableCellWithIdentifier:), а затем вернуть эту ячейку. Если в табличном представлении нет многократно используемых ячеек, вам необходимо создать новую ячейку из файла пера.

В Интернете есть много примеров, и вы также можете найти их здесь, в SO, например, в этот ответ .

Я бы порекомендовал прочитать в Apple Руководство по программированию TableView , которое также содержит раздел по загрузке ячеек из перьев .

UPDATE: Попытка объяснить TableView и повторно использовать ячейки другим способом.

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

Каждая показанная картина нуждается в Рамка. Без рамки не может быть положить на стену. Рамки дороги сделать и занять много места. рамный парень хочет успеть ни деньги на строительство тысяч кадров необходимо.

Он узнает, что хочет быть нуждающимся рамки для всех картин, которые в данный момент не отображается Он бы только нужно десять кадров для текущего выставленные картины. Когда галерея менеджер снимает картину, Frame Maker сохраняет кадр, и когда менеджер галереи выставил новый рисует и просит создателя кадра рамка для нее, производитель рам возвращает кадр из предыдущего картина снова.

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

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

В конце концов, вам не нужно заботиться об экономии ресурсов путем повторного использования одной ячейки. Это ответственность TableViews. Это деталь реализации TableView, сколько ячеек необходимо и как оно используется. Протокол определяет, как вы можете запросить у TableView многократно используемую ячейку, и в документации указано, что вы должны это сделать. Этого должно быть достаточно. Демонстрационные проекты показывают, что TableView может управлять очень большими объемами данных. Если ваши проекты борются с производительностью из-за создания 10-20 ячеек из nib, у вас, вероятно, есть проблемы с файлом nib или чем-то еще. Тем не менее, есть некоторые дискуссии о производительности загрузки с nib по сравнению со сборкой ячеек в коде . Это может быть вам интересно.

0 голосов
/ 16 июля 2010

У меня было очень странное поведение, очень похожее на то, что вы описали некоторое время назад.

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

Как сказал Вегар, существует множество обучающих программ, как это сделать.

...