iOS 13 и UINavigationBarDelegate :: shouldPop () - PullRequest
       26

iOS 13 и UINavigationBarDelegate :: shouldPop ()

0 голосов
/ 30 сентября 2019

Я обновил 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: все хорошо.

1 Ответ

0 голосов
/ 30 сентября 2019

Удалите модификатор закрытого доступа из объявления класса контроллера Navigation.

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 {
        // working
        return true
    }
}

Частный доступ ограничивает использование сущности / класса для вложенной декларации и расширений этой декларации, которые находятся в том же файле.

Если проблема не решена, дайте мне знать.

...