Проблема с порядком разделов UITableView numberOfRowsInSection

#iphone #objective-c #uitableview

#iPhone #objective-c #uitableview ( пользовательский просмотр ) #uitableview

Вопрос:

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

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

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

Комментарии:

1. На чем вы основывали свое утверждение: «правильный вывод должен быть …»? Предположение — ваш злейший враг при написании кода.

2. потому что listOfComboBoxes это элемент, NSMutableArray содержащий три NSMutableArray s. количество первого равно 2, второго равно 11, а третьего равно 20. весь смысл в том, почему это начинается с раздела 3.

3. Это правда, мой босс всегда говорит мне это

4. @robin: разве нет исправления? должен ли я изменить порядок моего массива, чтобы это исправить?

Ответ №1:

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

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

Комментарии:

1. если это правильный ответ. не забудьте пометить его как правильный

Ответ №2:

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

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

Комментарии:

1. откуда ты знаешь, что это не проблема!!!!! например, как вы хотите, чтобы я заполнил раздел 1, содержащий 11 строк, массивом, содержащим 2 значения… у меня не всегда одинаковое количество массивов или строк, поскольку данные анализируются из Интернета…

2. ?!?! У меня есть набор данных с 3 разделами, в первом разделе 5 строк, во втором 7, а в третьем 2. Теперь скажите мне, какая разница, В каком порядке у меня запрашивают данные, вы спрашиваете меня о количестве разделов для раздела номер 3? Я возвращаю 2, раздел 1? Я возвращаю 5, раздел 2? Я возвращаю 5. То же самое для строк, вы запрашиваете у меня данные для раздела 2, строка 3… не проблема! Если вы думаете, что это проблема, то вы неправильно ее «видите».

Ответ №3:

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

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

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

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

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

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

Комментарии:

1. @marzapower: смотрите первый комментарий к вопросу «Саймон Ли».

2. Вы делаете что-то неправильно. Вы никогда не должны, и я говорю » никогда «, предполагать порядок, в котором этот метод вызывается SDK. У вас должен быть switch один case раздел для каждого отдельного раздела, а не делегировать все в else блок. Это действительно плохой подход к программированию.

3. как я могу реализовать switch блок, если количество разделов неизвестно до завершения синтаксического анализа?

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

5. @Nagi нехорошо говорить дурным тоном с людьми, у которых ты просишь помощи. Вы сделали это практически для каждого ответа здесь (включая мой). Все говорили вам одно и то же, в чем причина? Потому что мы опытные разработчики iOS и знаем, что делаем. Если вы чувствуете, что знаете лучше, тогда вам вообще не стоит задавать вопрос.

Ответ №4:

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

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

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

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

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

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section