Проблема заголовка раздела UITableView - PullRequest
0 голосов
/ 25 октября 2011

All

У меня есть сгруппированный UITableView с возможным общим количеством 3 разделов. Может быть 1, 2 или 3.

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

Это, очевидно, не работает, так как раздел 0 не всегда представляет то, что показывает заголовок 0.

Пример: Заголовок # 0 = "Игра в процессе". Но игры не возвращаются из базы данных. Существуют только «Игры закончились». Поэтому в разделе 0 будут все «игры окончены». Я не хочу, чтобы в «Играх закончились» заголовок «Игры в процессе».

Я не могу найти способ проверить значение раздела, а не число.

Проще говоря, я хотел бы показать заголовок раздела № 3 для имени раздела № 3, даже если имя раздела № 3 - это раздел № 0.

Я знаю, что это кажется тривиальным и, вероятно, простым ... но я застрял. Любая помощь приветствуется.

Спасибо.

----- КОД -----

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {


    return [[fetchedResultsController_ sections] count];

}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController_ sections] objectAtIndex:section];


    return [sectionInfo numberOfObjects];
}


- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {


    if(section == 0)
    {
        return 50.0f;
    }
    else if (section == 1)
        return 50.0f;

    else
        return 50.0f;


}

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {


    if(section == 0 )
    {
        return 50.0f;
    }
    else if (section == 1)
        return 5.0f;

    else
        return 80.0f;


}



- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {

    if(section == 0)
    {
        return headerView1;
    }
    else if (section == 1)
        return headerView2;

    else
        return headerView3;

}

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {

    if(section == 0)
    {
        return footerView1;
    }
    else if (section == 1)
        return footerView2;

    else
        return footerView3;

}

Ответы [ 2 ]

0 голосов
/ 26 октября 2011

Кажется, что в вашем cellForRowAtIndexPath вы уже должны иметь некоторую логику, которая решает, из какой группы показывать данные, может быть что-то вроде:

 NSArray *group;
 int section = indexPath.section;
 if (![gamesInProgress count]) section++;
 switch (section) {
     case 0:
          group = gamesInProgress;
          break;
     case 1:
          group = finishedGames;
          break;
     // etc.
}

В вашем viewForHeaderInSection напишите аналогичный код, который устанавливает вместо этого NSStringNSArray.

0 голосов
/ 25 октября 2011

Очевидно, что решение, какой заголовок / колонтитул показывать, проверив раздел #, неверно (это плохой MVC).Для решения вашей проблемы было бы лучше увидеть некоторый реальный код, хотя я думаю, что я могу предложить что-то общее:Показанные вами разделы взяты из некоторого источника данных - массива, словаря или некоторой другой коллекции (это та же коллекция, которую вы используете, например, для определения возвращаемого значения для метода делегата numberOfSectionsInTableView:. Если у вас естьуже сделано, вы должны включить эти экземпляры данных в некоторый объект, который содержит сами данные (это данные, которые вам обычно нужны для отображения элементов cell / header / footer вместе с фактическими значениями данных) - в этом объектедобавить дополнительное перечисляемое значение «HeaderType», чтобы каждый объект «знал», как он должен отображаться.Таким образом, ваш MVC идеален: ваши данные хранятся в коллекции пользовательских объектов, ваш контроллер знает, как отображать данные по их типу, и, конечно, ваш взгляд показывает данные должным образом на основе инструкций контроллера.Вот пример перечисления, которое может помочь:

typedef enum {
 kHeaderTypeGameProgress,
 kHeaderTypeGameStats,
 kHeaderTypeGameDate
} HeaderType;

В ваших методах "viewForHeader" или "viewForFooter" просто добавьте тип переключателя, чтобы проверить HeaderType данных и соответственно создать представление.Надеюсь, я помог, удачи!

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