Подтвердить что ты не робот

Черный экран после представления модального контроллера в текущем контексте от UITabBarController

My root view controller - это UITabBarController. Я пытаюсь представить контроллер модального представления над одним из контроллеров представления контроллера панели табуляции, но все же разрешаю использовать панель вкладок для перехода на другую вкладку - другими словами, я хотел бы, чтобы модальная была только прерывать поток этой конкретной вкладки, а не все приложение.

Чтобы сделать это, я установил стиль представления представления представления представления как "Over Current Context" в раскадровке. Проблема, с которой я сталкиваюсь, заключается в том, что после представления модального контроллера представления и выбора новой вкладки представление представления представления представления удаляется из окна и не добавляется обратно в окно при увольнении представленного контроллера представления. После отклонения контроллера просмотра, перехода на другую вкладку, а затем возвращения, наконец, вернет контроллер представления в окно.

Я воспроизвел свою проблему, используя шаблон "Tabbed" в Xcode.

После представления модального - я добавил прозрачность к представленному контроллеру представления, чтобы легко увидеть, что происходит в представленном контроллере представления.

Переход на вторую вкладку, а затем назад - представление контроллера представления представления теперь удалено.

Увольнение модального листа приводит к тому, что отображающий контроллер представления с ним все еще удаляется из окна. Переход на вкладку 2 и возврат добавляет представление обратно в окно.

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

4b9b3361

Ответ 1

У меня была такая же проблема, и я смог ее решить, установив self.definesPresentationContext = YES; на представлении контроллера представления перед представлением модального VC. Вы также можете установить это в раскадровке, флажок называется "Определяет контекст" в Interface Builder.

Ответ 2

iOS 10+ и Swift 3 +

У меня очень хорошее решение этой проблемы. Представляется использование над полноформатным модальным стилем представления для контроллера вида.

let storyboard = UIStoryboard(name: "Main", bundle: nil)  // Replace "Main" with your storyboard name

if let viewController = storyboard?.instantiateViewController(withIdentifier: "viewController Identifier") as? ViewController {
            viewController.modalPresentationStyle = .overFullScreen
            self.present(viewController, animated: false, completion: { 
            })
        }

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

Если вы используете segue, чтобы представить контроллер представления, выберите "Over Full Screen" из стиля модальной презентации в режиме проверки атрибутов

Ответ 3

Попробуйте представить контроллер вида в окне приложения. У меня была аналогичная проблема, которая была исправлена ​​с помощью кода ниже:

    let myNewVC = mainStoryBoard.instantiateViewController(withIdentifier: "MyNewVCId") as! MyNewVC
    let navController = UINavigationController(rootViewController: myNewVC)
    navController.modalPresentationStyle = UIModalPresentationStyle.overCurrentContext    

    let appDelegate = UIApplication.shared.delegate as? AppDelegate
    appDelegate?.window?.rootViewController?.present(navController, animated: true, completion: nil)

Надеюсь, это тоже поможет.

Ответ 4

Имея аналогичную проблему с моим контроллером табуляции, однако, как и комментарии, я предлагаю изменить segue на push или show segue. Это позволит этой вкладке оставаться в такте с новым представлением вместо старого представления при переключении на другие вкладки. Если эстетика является проблемой, вы можете создать пользовательский контроллер навигации, чтобы настроить внешний вид нового представления.

Ответ 5

Я воспроизвел вашу проблему и нашел решение. Это не связано с изменением метода segue или изменением некоторых атрибутов в раскадровке.

Предложение:

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

Сказав, что вот решение, которое я предлагаю.

Решение:

Я считаю, что проблема заключается в том, как UITabBarController обрабатывает свою иерархию представлений.

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

В методе viewWillDisappear вашего модально представленного ViewController добавьте это.

- (void)viewWillDisappear:(BOOL)animated {
    [self dismissViewControllerAnimated:true completion:^{
    [super viewWillDisappear:animated];
  }];
}

Ответ 6

У меня такая же проблема в текущем стремительном проекте. Я сделал обходной путь.

Затем, наконец, я использовал NSNotificationCenter и отклонил этот контроллер просмотра, когда табуляция была изменена для решения этой проблемы.

Я ссылаюсь на контроллер таблеток в AppDelegate и устанавливаю там делегат.

let storyboard : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)

let tabbarcontroller = storyboard.instantiateViewControllerWithIdentifier("MyTabBarController") as! UITabBarController

tabbarcontroller.delegate = self

И он делегируется как

//MARK: - Tabbar controller delegate

extension AppDelegate : UITabBarControllerDelegate {

    func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) {

        NSNotificationCenter.defaultCenter().postNotificationName("TabBarTabChanged", object: nil)
    }
}

Затем я добавляю наблюдателя в свой представленный контроллер представления как

override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(PreviewPlaceVC.BackClickAction(_:)), name: "TabBarTabChanged", object: nil)
}

// MARK: - Button Click Actions

@IBAction func BackClickAction(sender: AnyObject) {
     self.dismissViewControllerAnimated(true, completion: nil)
}

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

Ответ 7

Попробуйте установить стиль презентации как "Over Full Screen", а не "Over Current Context" в раскадровке. введите описание изображения здесь