Убедитесь, что представляющий 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)")
}
}
}