как подключить несколько представлений к одному элементу панели вкладок в Swift?

У меня есть контроллер панели вкладок, который имеет два элемента, подключенных к двум контроллерам представления (скажем, A и B), теперь я хочу добавить третий контроллер представления (скажем, C). Но я не хочу добавлять третий значок в виде вкладок. Когда пользователь выбирает второй значок, он должен отображать B или C в зависимости от того, вошел ли пользователь в систему или нет.

Настройка раскадровки


person Iqbal Inzamam    schedule 16.04.2017    source источник
comment
если кто-то голосует против, по крайней мере, скажите мне, почему вы голосуете против?   -  person Iqbal Inzamam    schedule 16.04.2017
comment
Можете ли вы добавить, что вы сделали до сих пор здесь?   -  person Rahul    schedule 16.04.2017
comment
@IqbalInzamam: Вопросы обычно отклоняются в Stackoverflow, когда люди, кажется, не пытались найти решение для себя, прежде чем обращаться за помощью. Вы должны попытаться описать свои мысли о возможном подходе в своем вопросе и конкретно спросить, почему этот подход не работает или есть ли лучшие альтернативы.   -  person Mischa    schedule 16.04.2017
comment
И чувак: если ты хочешь получить полезные ответы здесь, по крайней мере, найди время, чтобы правильно задать свои вопросы. Я только что исправил ваше изображение, которое было связано только с заголовком, введите здесь описание изображения. В противном случае вы получите гораздо больше голосов против и даже хуже: без квалифицированного ответа.   -  person Mischa    schedule 16.04.2017


Ответы (1)


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

Из RouterViewController теперь вы можете представить любой контроллер представления (без анимации). Есть много способов сделать это, например:

  • Сделайте свой RouterViewController подклассом UINavigationController и динамически задайте его свойство rootViewController.
  • Сделайте свой RouterViewController контейнерным контроллером представления и соответствующим образом встройте нужный контроллер представления.
  • Представьте контроллер представления модально (без анимации) из вашего файла RouterViewController. (Лично я бы не рекомендовал этот вариант, потому что представление контроллеров модального представления предназначено для другой цели.)

и т.п.

person Mischa    schedule 16.04.2017
comment
Спасибо. Я пробую 1-й способ, который вы предложили. Поэтому я добавил контроллер навигации в качестве второго элемента контроллера вкладок. Тогда я не мог понять, где установить rootViewController навигационного контроллера. Это в viewDidLoad tabBarController и как его установить? Помогите мне, пожалуйста. - person Iqbal Inzamam; 16.04.2017
comment
Я подозреваю, что вы используете раскадровку? Если да: 1. Добавьте навигационный контроллер в качестве второй вкладки контроллера панели вкладок. 2. Создайте подкласс UINavigationController и назовите его RouterViewController. 3. Выберите навигационный контроллер в раскадровке и установите его класс на RouterViewController. 4. В методе RouterViewController viewDidLoad() установите корневой контроллер представления следующим образом: viewControllers = [theViewControllerYouWantToShow]. - person Mischa; 16.04.2017
comment
это может быть очень глупый вопрос. Извините, я очень новичок в ios. Я сделал, как вы сказали, как подключить UINavigationController и UIController (B & C), через какой тип перехода. Я сделал следующее, если (...){ viewControllers = [FirstViewController()] }else{ viewControllers = [SecondViewController()] }, но когда я нажимаю значок второй вкладки, он загружает навигационный интерфейс с черным экраном. Я прикрепил раскадровку схема в вопросе - person Iqbal Inzamam; 16.04.2017
comment
Вы не делаете это с переходами, вы делаете это в коде. Однако, если вы просто создадите экземпляр соответствующих контроллеров представления (FirstViewController()), вы получите контроллер представления с пустым (черным) представлением, потому что он никак не связан с раскадровкой. Чтобы связать его, вам нужно получить ссылку на вашу раскадровку в коде, а затем вызвать instantiateViewController(withIdentifier:) на нем. Просто создайте экземпляр контроллера представления Google из раскадровки, и вы найдете решение. - person Mischa; 16.04.2017