UITableView numberOfRowsInSection проблема заказа секции - PullRequest
1 голос
/ 09 июня 2011

У меня проблема при вставке данных в табличное представление. Я сделал этот маленький пример, демонстрирующий мою проблему:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    switch (section) {
        case 0:
            NSLog(@"section: %d",section);
            if([listOfItems count]!=0){
                NSLog(@"size: %d",[listOfItems count] / 2);
                return [listOfItems count] / 2;
            }
            else{
                sectionCount++;
                NSLog(@"size: %d", [[listOfComboBoxes objectAtIndex:0] count] - 1);
                return [[listOfComboBoxes objectAtIndex:0] count] - 1;
            }
            break;
        default:
            NSLog(@"section: %d",section);
            NSLog(@"size: %d", [[listOfComboBoxes objectAtIndex:sectionCount++] count] - 1);
            sectionCount--;
            return [[listOfComboBoxes objectAtIndex:sectionCount++] count] - 1;
            break;
    }
}

Вот что я получаю в журнале:

2011-06-09 11:14:40.753 TemplatesTest[1133:207] section: 3
2011-06-09 11:14:40.754 TemplatesTest[1133:207] size: 2
2011-06-09 11:14:40.754 TemplatesTest[1133:207] section: 0
2011-06-09 11:14:40.755 TemplatesTest[1133:207] size: 6
2011-06-09 11:14:40.755 TemplatesTest[1133:207] section: 1
2011-06-09 11:14:40.756 TemplatesTest[1133:207] size: 11
2011-06-09 11:14:40.756 TemplatesTest[1133:207] section: 2
2011-06-09 11:14:40.757 TemplatesTest[1133:207] size: 20

Мне интересно, почему это начинается с раздела 3? Правильный вывод должен быть (если он начался с раздела 0):

section: 0
size: 6
section: 1
size: 2
section: 2
size: 11
section: 3
size: 20

Кто-нибудь знает исправление?

Ответы [ 4 ]

3 голосов
/ 09 июня 2011

Почему это начинается с раздела 3?Реальный вопрос: почему вы предполагаете, что должно начинаться с нулевого раздела?В документации нет ничего, что определяло бы порядок вызова метода, поэтому не следует делать никаких предположений.В текущих реализациях он начинается в нижней части таблицы и работает, но, опять же, это предположение, и оно может вызвать проблемы в следующей версии iOS.

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

1 голос
/ 09 июня 2011

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

Неупорядоченные вызовы, вероятно, могут зависеть от того факта, что массивы, используемые внутри SDK, не упорядочены. Но, опять же, вы никогда не должны беспокоиться об этой «проблеме».

Вы утверждаете, что правильный вывод должен быть упорядоченным, но почему?

Редактировать

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

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

1 голос
/ 09 июня 2011

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

Вы должны использовать свойства indexPath.section и indexPath.row, чтобы определить, какая информация требуется для просмотра таблицы.

0 голосов
/ 09 июня 2011

Вы найдете тот же вопрос с дополнительной информацией здесь

http://www.iphonedevsdk.com/forum/iphone-sdk-development/70913-numberofsectionsintableview-called-twice-uitableview.html

Но, по моему предположению, UITableView создает ячейку снизу вверх, так что это причина или нет делегати методы источника данных вызываются для строк и разделов, которые находятся внизу экрана, а не в конце uitableview

Редактировать:

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

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...