Я обновил Xcode до 11, и я обнаружил некоторые проблемы на iOS13 Симуляторах / реальных устройствах нашего приложения iOS с shouldPop () методом из UINavigationBarDelegate протокол:
В этом протоколе есть 4 метода, 3 из них работают нормально, только этот shouldPop () больше не работает. Если я запускаю приложение на устройствах / симуляторах с предыдущей версией iOS, все в порядке, вызываемый shouldPop (), но если я запускаю приложение на iOS13, mustPop () не вызывается. Поскольку в предыдущей версии iOS все в порядке, вызываются 3 из 4 методов протокола, и я не нахожу в документации, что shouldPop () не поддерживается / устарел, похоже, это ошибка, но я не уверен.
У вас, ребята, есть идеи по этому поводу?
Спасибо, Тиби.
private class DummyNavigationController: UINavigationController, UINavigationControllerDelegate, UINavigationBarDelegate {
var rootViewController: UIViewController? {
didSet {
self.delegate = self
}
}
func navigationBar(_ navigationBar: UINavigationBar, didPush item: UINavigationItem) {
// working
}
func navigationBar(_ navigationBar: UINavigationBar, shouldPush item: UINavigationItem) -> Bool {
// working
return true
}
func navigationBar(_ navigationBar: UINavigationBar, didPop item: UINavigationItem) {
// working
}
func navigationBar(_ navigationBar: UINavigationBar, shouldPop item: UINavigationItem) -> Bool {
// not working
return true
}
}
private class DummyViewController: UIViewController {
convenience init(_ showBackText: Bool) {
self.init()
if !showBackText {
self.navigationItem.title = ""
}
}
}
class OpenModalWithNavigation {
static func present(viewController: UIViewController,
parentViewController: UIViewController,
showBackText: Bool = false,
presentationStyle: UIModalPresentationStyle = .overCurrentContext,
transitionStyle: UIModalTransitionStyle = .crossDissolve) {
let navController = DummyNavigationController()
navController.rootViewController = parentViewController
navController.pushViewController(DummyViewController(showBackText), animated: false)
navController.pushViewController(viewController, animated: false)
navController.modalPresentationStyle = presentationStyle
navController.modalTransitionStyle = transitionStyle
parentViewController.present(navController, animated: true, completion: nil)
}
}
Редактировать: После некоторого изучения нашего большого кода, мы звоним popViewController () от пользовательской кнопки «назад». Это похоже на приведенный ниже код: если я вставлю DummyNavigationController через экземпляр OpenModalWithNavigation.present () a qqq , mustPop () не будет запущен.
class qqq: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.green
let button = UIButton(type: .custom)
let backImage = UIImage(named: "back")
button.setImage(backImage, for: .normal)
button.frame = CGRect(x: 0, y: 0, width: 30, height: 30)
button.addTarget(self, action: #selector(self.goBack), for: .touchUpInside)
let backButton = UIBarButtonItem(customView: button)
self.navigationItem.leftBarButtonItem = backButton
}
@objc func goBack() {
self.navigationController?.popViewController(animated: true)
}
}
Кроме того, в упрощенной форме qqq (см. Ниже) он не будет работать ... Кажется, это связано с popViewController ()
class qqq: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(2), execute: {
self.navigationController?.popViewController(animated: true)
})
}
}
Если я нажимаю кнопку возврата по умолчанию, все в порядке, shouldPop () вызывается;не когда мы вызываем popViewController () - это происходит только на работающем устройстве / симуляторе iOS13;для pre-iOS13: все хорошо.