Изменить ViewController в UITabBarController программно

#ios #uitabbarcontroller

#iOS #uitabbarcontroller

Вопрос:

Я пытался создать приложение, связанное с контактами. В раскадровке точкой входа является UITabBarController, а затем четыре UINavigationController, которые подключаются к отдельному ViewController, как показано ниже.

Раскадровка

В моем первом TabBarItem исходный ViewController называется contactsVC. Я ввел коды, чтобы определить, разрешает ли IOS этому приложению доступ к контактам в viewWillAppear. Если не разрешить, я хочу установить другой ViewController для отображения политики конфиденциальности, а затем нажать кнопку, чтобы отобразить диалоговое окно IOS.

 contactsVC.swift:

let privacyViewController = self.storyboard?.instantiateViewController(withIdentifier: "accessForContactsViewController") as! AccessForContactsViewController
self.navigationController?.setViewControllers([privacyViewController], animated: false)
  

С помощью приведенных выше кодов я могу встроить контроллер просмотра конфиденциальности в TabBarController.

в privacyViewController после нажатия кнопки у меня есть коды, как показано ниже.

 globalContactStore.requestAccess(for: CNEntityType.contacts, completionHandler: {(access, error) -> Void in
            if access {
                    let contactVC = self.storyboard?.instantiateViewController(withIdentifier: "contactsViewController")
                    self.navigationController?.setViewControllers([contactVC!], animated: false)

                }
            } else {

                let gotoSettingsVC = self.storyboard?.instantiateViewController(withIdentifier: "gotoSettingsViewController")
                self.navigationController?.setViewControllers([gotoSettingsVC!], animated: false)
            }
        })
  

Моя цель состоит в том, чтобы, если доступ разрешен, приложение отображало исходный контроллер представления в текущей панели вкладок, то есть contactsVC. в противном случае покажите другой view controller. Но приведенные выше коды не работают.

Комментарии:

1. Трудно понять, что вы подразумеваете под «не работает». Что вы видели, что произошло? Вызывается ли ваша requestAccess функция, является self.navigationController? нулевым? Откуда вы знаете?

2. Спасибо Джоне за ваши быстрые ответы. Я ввожу print() и вижу, что NavigationController не равен нулю.

3. Я нашел причину, по которой с помощью simulator требуется время для печати длинного журнала, а затем перехода к ожидаемому контроллеру представления. Журнал таков: это приложение изменяет механизм автозапуска из фонового потока, что может привести к повреждению движка и странным сбоям. Это вызовет исключение в будущей версии. Стек:( 0 CoreFoundation 0x0000000105b5cf45 __exceptionPreprocess 165 1 libobjc.A.dylib 0x00000001052b3deb objc_exception_throw 48 2 CoreFoundation 0x0000000105b5ce7d [NSException raise:format:] 205

4. Ошибка устранена после ввода кодов (self.NavigationController?.setViewControllers) в основной поток. DispatchQueue.main.async {}