Переключите фрагменты иерархии UINavigationController и сохраните панель навигации - PullRequest
0 голосов
/ 07 августа 2011

Это несколько затянуто, но я думаю, что лучше быть ясным.Я не могу найти окончательный способ сделать это, и проблема тонкая (я думаю).

У меня есть приложение, иерархия GUI которого выглядит примерно так:

  • Основной список (имеет настраиваемую ячейку и высоту таблицы)
    • Подсписок (для выбранного элемента Основного списка)
      • Информация подсписка (для выбранного элемента Подсписка)
        • Далееинформация
    • Настройки (для выбранного элемента главного списка)
      • Настройки Информация (для выбранного элемента настроек)
        • Далееинформация

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

Я пробовал несколько подходов, и, похоже, ничего не работает точно.

Первая попытка (вдохновленный другими вопросами здесь)

  • UINavigationController
    • UITableViewControllerBase (загружается из кончика)
      • TableViewController1 (загружается программно в didSelectRowAtIndexPath)
      • TableViewController2 (можно поменять местами из TableViewController1)

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

[rootViewController switchViews]

В rootViewController.switchViews ():

[TableViewController2 alloc] init];
[TableViewController1 removeFromSuperview];
[self.view insertSubview:TableViewController2.view atIndex:0]
. . .

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

В cellForRowAtIndexPath:

static NSString *CellId = @"CellId";
UITableViewCell *cell = [tableView dequeueReusableCellWithIDentifier:CellId];
if (cell == nil)
{
  ... (this does not get called)
}

, потому что кодв скобках не вызывается, табличное представление выглядит «универсальным», то есть пользовательская ячейка не используется.Хотя это может быть не связанной ошибкой, весь подход здесь не показался мне правильным.Насколько я понимаю, активный контроллер представления должен обрабатывать коммутатор.Поэтому я попробовал что-то другое.,.

Вторая попытка (по мотивам книги «Программирование для начинающих iPhone»):

  • UINavigationController
    • UITableViewControllerBase (загружается из пера)
      • UIViewControllerParent (загружается программноon didSelectRowAtIndexPath)
        • TableViewController1 (загружается программно в родительский loadView)
        • TableViewController2 (может быть заменен из TableViewController1)

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

В loadView () родительского объекта:

TableViewController1 *tvc1 = [[UITableViewController alloc] init];
self.tableViewController1 = tvc1;
[self.view insertSubview:tableViewController1.view atIndex:0];
[tvc1 release];

Проблема заключается в том, что tableViewController1, хотя и инициирован, не имеет действительного представления во время его вставки.Таким образом, функция loadView вызывается снова и снова.,,Я также попытался поместить этот код в viewDidLoad, та же проблема.

Я прочитал пример кода TheElements с сайта разработчика iOS и изначально собирался пойти по этому пути.Проблема в том, что после того, как пользователь переключает представления в моем приложении, появляется больше экранов, в которые он может углубиться.Я хочу, чтобы все эти экраны были частью иерархии приложения (чтобы мы могли вернуться к Основному списку, когда захотим).В то время как TheElements иллюстрирует переключение, оно просто переключает представления в одном UIViewController - мне нужно иметь возможность развернуть детали после перехода к новым экранам и сделать так, чтобы все эти экраны были частью иерархии UINavigationViewController, для целей навигации.

Я новичок во всем этом, так что возможно я думаю о вещах неправильно. Отсюда и вопрос. Я уверен, что этот дизайн несколько распространен, поэтому, хотя, несомненно, есть много способов сделать это, я ищу лучшую практику. Ключевым моментом здесь является то, что после того, как переключение выполнено, пользователь должен иметь возможность перемещаться дальше вниз по иерархии UINavigationViewController и иметь возможность перемещаться обратно вверх. Это требует загрузки нескольких UIViewControllers. Я верю.

Большое спасибо за время (и извинения за длинный пост).

1 Ответ

1 голос
/ 07 августа 2011

Итак, если я правильно понимаю ваш вопрос, вы хотите переключиться между двумя контроллерами представления в верхней части стека контроллера навигации. Почему бы вам просто не позволить контроллеру навигации выполнить работу и использовать setViewControllers:animated:, заменив только последний контроллер представления в существующем массиве.

Пример, с дополнительной анимацией отражения (в SubListViewController):

- (void)switchToSettings:(id)sender
{
    [UIView transitionWithView:self.navigationController.view duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft animations:^ {
        SettingsViewController *settingsVC = [[[SettingsViewController alloc] initWithStyle:UITableViewStyleGrouped] autorelease];
        settingsVC.mainListItem = self.mainListItem;
        NSMutableArray *mutableViewControllers = [NSMutableArray arrayWithArray:self.navigationController.viewControllers];
        [mutableViewControllers removeLastObject];
        [mutableViewControllers addObject:settingsVC];
        [self.navigationController setViewControllers:mutableViewControllers animated:NO];
    } completion:^(BOOL finished) {}];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...