Выдвижение контроллеров представления в UITableViewController сгруппировано

Итак, у меня есть 3 раздела, как я уже говорил в моем предыдущем вопросе, например, "A", "B", "C".

Это код, который я использую:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{
    switch (indexPath.row) 
    {
        case 0:
            [self.navigationController pushViewController:[[[FirstViewController alloc] initWithNibName:nil bundle:nil] autorelease] animated:YES];
            break;

        case 1:

            [self.navigationController pushViewController:[[[SecondViewController alloc] initWithNibName:nil bundle:nil] autorelease] animated:YES];
            break;
    etc..       
 }
}

Это моя проблема: в "А" у меня 6 элементов. Если я использую переключатель от 0 до 5, он выталкивает нужные контроллеры вида. Но когда мне нужно вытолкнуть контроллеры вида для секции "B", которая содержит еще 9 элементов, я продолжаю работу со счетчиком (например, случай 7,8 и т. Д.), Он снова начинает показывать контроллеры с самого начала (это снова выталкивает FirstViewController"и т. д.). Та же история для раздела" C ". Как решить эту проблему?

Я ненавижу сгруппированные столы, черт побери.

Редактировать: новый код, цикл

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{  
    switch (indexPath.section) 
    {
        case 0:


            switch (indexPath.row) {
                case 0:

                    [self.navigationController pushViewController:[[[FirstViewController alloc] initWithNibName:nil bundle:nil] autorelease] animated:YES];
                break;

                case 1:

                    [self.navigationController pushViewController:[[[SecondViewController alloc] initWithNibName:nil bundle:nil] autorelease] animated:YES];
                break;
        }

        case 1:
            switch (indexPath.row) {
                case 0:
            [self.navigationController pushViewController:[[[ThirdViewController alloc] initWithNibName:nil bundle:nil] autorelease] animated:YES];
            break;
        case 1:
            [self.navigationController pushViewController:[[[FourthViewController alloc] initWithNibName:nil bundle:nil] autorelease] animated:YES];
            break;

        case 2:
            [self.navigationController pushViewController:[[[FifthViewController alloc] initWithNibName:nil bundle:nil] autorelease] animated:YES];
            break;

            }
        case 2:
            switch (indexPath.row) {
                case 0:
            [self.navigationController pushViewController:[[[SixthViewController alloc] initWithNibName:nil bundle:nil] autorelease] animated:YES];
            break;

        case 1:
            [self.navigationController pushViewController:[[[SeventhViewController alloc] initWithNibName:nil bundle:nil] autorelease] animated:YES];
            break;



            }
    }
}

Я явно вырезал код, слишком длинный в противном случае.

Изменить 2:

Работал! Серхио ответил правильно, но я положил if (indexPath.section == 0) вместо switch (indexPath.section){}

1 ответ

Решение

NSIndexPathindexPath аргумент, что didSelectRowAtIndexPath передается имеет два свойства: row а также section, Если вы правильно используете section информация, вы сможете выделить среди трех разделов, которые у вас есть.

Например (это некрасиво, но это будет работать):

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{
    switch (indexPath.section) 
    {
        case 0:
        switch (indexPath.row) 
        {
            case 0:
            ...
            break;
            ...
        }
        break;

        case 1:

        switch (indexPath.row) 
        {
            case 0:
            ...
            break;
            ...
        }
        break;

        etc...
   }
}

Лучшим решением, IMO, было бы кодирование в вашем источнике данных типа подстолбца, связанного с каждым элементом, так что вам не нужен большой переключатель, и каждая ячейка уже "знает", какую подстолкну следует открыть. Вы можете проверить Class тип (посмотрите также на этот вопрос).

Другие вопросы по тегам