Как переключить ViewController вместо добавления в стек? - PullRequest
3 голосов
/ 16 марта 2012

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

Each object holds a reference to it's neighbors, square and triangle are different class types

Классы буксировки, треугольник и квадрат, отображаются с помощью ViewController и связываются друг с другом с помощью сегментов.

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

Итак, я ищу способ не добавить следующий ViewController поверх текущего в стеке, а заменить текущий ViewController следующим.

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

Ответы [ 5 ]

2 голосов
/ 16 марта 2012

Добавьте все subView один раз, в viewDidLoad и присвойте теги всем вашим SubView после того, где вы хотите показать это представление в viewController, не добавляйте его, просто выведите его вперед, вызвав функцию [[self.view viewWithTag: 1] BringToFront]

1 голос
/ 16 марта 2012

Метод setViewControllers контроллера UINavigation является опцией.

Другим способом было бы вытолкнуть наиболее современный контроллер представления, используя popViewControllerAnimated: в некоторых случаях popToRootViewControllerAnimated: было бы лучше или даже popToViewController: animated :.Однако лично мне не удалось использовать popToViewController: animated: но в то время я мог быть виноват.

Да, я думаю, вам нужен контроллер корневого представления.Я сам пытался заменить контроллер корневого представления на днях, но не смог сделать это.В конце концов, это было, вероятно, не самое элегантное решение, но мне было проще реализовать какой-то фиктивный контроллер корневого представления, который ничего не делает, но отображает логотип моего приложения на заднем плане (То же, что изображение по умолчанию, но перемещено в отрицательные координаты, чтобы соответствовать значению по умолчанию)изображение при запуске. Оно лежит «позади» панели навигации и строки состояния.).Это может показать какой-то пустой черный фон или около того.В конце концов, это, скорее всего, никогда не будет видно.

1 голос
/ 16 марта 2012

Похоже, вы хотите сделать одну из нескольких вещей

  1. Замените свой rootViewController
  2. Имейте rootViewController, который действует как контейнер для одного UIViewController и заменяйте его по мере необходимости. В iOS 5 вы можете сделать это с помощью пользовательского UIViewController, but or you could use one which Apple provided. UINavigationController`, но если вы не используете его для навигации по древовидной структуре контроллеров представления, это, вероятно, не лучший вариант.

Ваш лучший ответ зависит от ваших потребностей.

Если ваши контроллеры не имеют большого количества состояний или не слишком часто меняются местами, вы можете использовать опцию 1.

Если вы ожидаете, что пользователи будут часто и быстро переключаться между контроллерами, и / или ваши контроллеры требуют значительных настроек или имеют много состояний, тогда вы можете выбрать NSArray и просто использовать presentViewController:animated:completion:, чтобы при необходимости показывать разные контроллеры. Хранение ваших контроллеров в NSArray имеет дополнительный бонус - возможность легко идентифицировать своих соседей.

1 голос
/ 16 марта 2012

Вы должны взглянуть на метод UINavigationController setViewControllers: animated: .

1 голос
/ 16 марта 2012

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

...