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