Как на самом деле лучше всего иметь БОЛЬШЕ ОДНОГО контроллера в контейнере?

Вот ViewController, и у него есть представление контейнера. Обратите внимание, что контейнер, как обычно, является лишь частью полноэкранного режима.

введите здесь описание изображения

Таким образом, контейнер содержит VC справа. Это может быть, скажем, «Запчасти», показывающий список запчастей.

Но что, если у меня есть, скажем, четыре VC, которые я хочу поместить в эту область (где находится контейнер). Возможно: запчасти, шины, тормоза, масла.

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

Какой, черт возьми, лучший способ сделать это?

В прошлом я сделал четыре вида контейнера (в одном и том же месте и размере) и просто открыл тот, который хотел, а остальные три удалил вручную.

Какое здесь правильное решение???

Примечание. Связанный с этим вопрос: может ли представление контейнера на самом деле указывать на более чем один VC ?? (Таким образом, вы все еще можете поменять местами «вручную», просто будет намного проще использовать только одно, а не пять совпадающих представлений контейнера.)

Наконец, вот соответствующее эссе, найденное на сайте www...

http://sandmoose.com/post/35714028270/storyboards-with-custom-container-view-controllers


person Fattie    schedule 28.08.2014    source источник


Ответы (2)


У вас есть, как и ожидалось, несколько вариантов.

Вариант 1. Используйте UIPageViewController. Затем вы даже можете переключаться между различными дочерними контроллерами представления, и они будут загружаться только тогда, когда они необходимы.

Вы должны установить UIPageViewController в dataSource для объекта, который реализует по крайней мере эти два метода:

#pragma mark - UIPageViewControllerDataSource
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController
      viewControllerBeforeViewController:(UIViewController *)viewController
{
    // Return the viewController instance _before_ the given viewController or nil when there are no more view controllers to display.

    return nil;
}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController
       viewControllerAfterViewController:(UIViewController *)viewController
{
    // Return the viewController instance _after_ the given viewController or nil when there are no more view controllers to display.

    return nil;
} 

Вариант 2 Создайте выход для представления контейнера, а затем программным способом добавьте или удалите дочерний контроллер представления, который вы хотите отобразить, например так:

- (void)setCurrentChildViewController:(UIViewController *)viewController
{
    // Remove existing child
    if (self.currentChildViewController) {
        if (self.currentChildViewController.isViewLoaded) {
            [self.currentChildViewController.view removeFromSuperview];
        }
        [self.currentChildViewController willMoveToParentViewController:nil];
        [self.currentChildViewController removeFromParentViewController];
    }

    // Now add viewController as child
    [self addChildViewController:viewController];
    [viewController didMoveToParentViewController:self];
    viewController.view.frame = self.containerView.bounds;
    viewController.view.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;

    [self beginAppearanceTransition:YES animated:NO];
    [self.containerView addSubview:viewController.view];
    [self endAppearanceTransition];

    self.currentChildViewController = viewController;
}

Вариант 3 Скрыть и показать дочерние контроллеры представления, как вы описали в своем вопросе, но я бы предпочел выбрать вариант 1 или 2, в зависимости от ваших потребностей.


Сноска для начинающих:

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

SomeViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"someViewControllerStoryboardID"];
// see method created in option 2
[self setCurrentChildViewController:vc];
person Johannes Fahrenkrug    schedule 28.08.2014
comment
Святое дерьмо! Я никогда не думал об UIPageViewController, спасибо! правда ли, что сложно не смахивать? (Например, stackoverflow.com/a/24847685/294884 ). Я бы хотел, чтобы это изменилось только тогда, когда я так говорю. .. ты думаешь? Еще раз спасибо! - person Fattie; 28.08.2014
comment
Программное добавление/удаление дочернего представления. (Кстати, это отличный пример кода, спасибо.) Это кажется чреватым проблемами.. Я обнаружил, что мне пришлось написать целый подкласс VC для аккуратной обработки, понимаете? На самом деле я обнаружил, что, используя схему 3, действительно лучше всего сделать совершенно новый контейнер с несколькими держателями VC! который ДЕРЖИТ ваши 4 или 5 венчурных капиталистов, иначе это просто беспорядок. Я поражен, что нет супер-простого решения для этого. Я собираюсь попробовать вашу поразительную идею UIPageViewController... - person Fattie; 28.08.2014
comment
@JoeBlow Спасибо! Ручное добавление/удаление дочерних VC работает довольно хорошо, но UIPageViewController тоже работает хорошо. Чтобы отключить прокрутку, проверьте это: stackoverflow.com/a/24847685/171933 - person Johannes Fahrenkrug; 28.08.2014
comment
Я добавил небольшой совет для новичков (ошибаюсь - я не зацикливался на этом часами или что-то в этом роде :)) - person Fattie; 29.08.2014

Я использовал сегментированный элемент управления с содержащим scrollView.

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

person Zhang    schedule 28.08.2014
comment
Привет Чжан! На самом деле, это то, что я делаю в настоящее время, как я уже сказал, просто вручную меняю местами, в основном, венчурные капиталисты. Я хочу знать, как это сделать! :) - person Fattie; 28.08.2014