Убедитесь, что представляющий ViewController для поповера является оригинальным презентатором

У меня есть контроллер просмотра контейнера. Один из дочерних контроллеров представления должен представить popover. Проблема в том, что поповер presentingViewController в конечном итоге является контроллером представления контейнера, а не дочерним контроллером представления, который его представил.

* Я установил definesPresentationContext собственность на true на дочернем контроллере представления (и его контроллере навигации), но это ничего не меняет (это полезно, только если представленный контроллер modalPresentationStyle является .currentContext или же overCurrentContext

Документация для UIViewController present(_:animated:completion:) говорит о том, как презентация может быть с другого контроллера в зависимости от стиля презентации. Так что я надеюсь, что есть способ переопределить или перехватить это определение, чтобы я мог убедиться, что в этом случае поповер presentingViewController это контроллер, который первоначально представил его.

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

Есть ли способ обеспечить поповер presentingViewController это оригинальный ведущий? Это, вероятно, связано с тем, как presentationController создан, но я не вижу, как подключиться к этому процессу.

Ниже приведен код, который демонстрирует проблему. Если вы хотите повторить проблему, создайте новый проект iOS Single App App в XCode. Затем заменить содержимое предоставленного ViewController.swift с кодом ниже. Запустите на симуляторе iPad. Контейнерный контроллер представления с одним дочерним контроллером представления будет добавлен, и всплывающее окно будет представлено от дочернего элемента. Консоль отладчика покажет некоторые результаты. Обратите внимание, как всплывающее окно presentingViewController это контейнер, а не ребенок.

Примечание. Хотя следующее относится к Swift, ответы Objective-C тоже подойдут.

import UIKit

class ViewController: UIViewController {
    var childViewController: UIViewController!

    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransition(to: size, with: coordinator)

        coordinator.animate(alongsideTransition: { (context) in
            self.childViewController.navigationController?.view.frame = CGRect(x: size.width / 2, y: 0, width: size.width / 2, height: size.height)
        }, completion: nil)
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        childViewController = UIViewController()
        childViewController.navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Test", style: .plain, target: nil, action: nil)
        let nav = UINavigationController(rootViewController: childViewController)

        addChildViewController(nav)
        view.addSubview(nav.view)
        nav.didMove(toParentViewController: self)
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)

        let popup = UIViewController()
        popup.definesPresentationContext = true
        let nav = UINavigationController(rootViewController: popup)
        nav.modalPresentationStyle = .popover
        nav.definesPresentationContext = true
        nav.popoverPresentationController?.barButtonItem = childViewController.navigationItem.leftBarButtonItem
        childViewController.present(nav, animated: true) {
            print("Popup displayed")
            print("container: \(self)")
            print("child: \(self.childViewController), child.nav: \(self.childViewController.navigationController)")
            print("presentingViewController: \(nav.presentingViewController)")
        }
    }
}

0 ответов

Другие вопросы по тегам