滑动到在iOS 13中不工作的popViewController
下面的代码,我已经完成了对popViewController的滑动。这对ios 12或更早的版本有效,但在ios 13中运行时不起作用。Xcode的当前版本是11.1 此外,我正在使用本机NavigationController和导航栏。所以我不认为这是一个问题,因为导航控制器滑动到在iOS 13中不工作的popViewController,ios,swift,uinavigationcontroller,ios13,xcode11,Ios,Swift,Uinavigationcontroller,Ios13,Xcode11,下面的代码,我已经完成了对popViewController的滑动。这对ios 12或更早的版本有效,但在ios 13中运行时不起作用。Xcode的当前版本是11.1 此外,我正在使用本机NavigationController和导航栏。所以我不认为这是一个问题,因为导航控制器 import UIKit class SwipeNavigationController: UINavigationController { // MARK: - Lifecycle overrid
import UIKit
class SwipeNavigationController: UINavigationController {
// MARK: - Lifecycle
override init(rootViewController: UIViewController) {
super.init(rootViewController: rootViewController)
}
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
self.setup()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.setup()
}
private func setup() {
delegate = self
}
override func viewDidLoad() {
super.viewDidLoad()
// This needs to be in here, not in init
interactivePopGestureRecognizer?.delegate = self
}
deinit {
delegate = nil
interactivePopGestureRecognizer?.delegate = nil
}
// MARK: - Overrides
override func pushViewController(_ viewController: UIViewController, animated: Bool) {
duringPushAnimation = true
super.pushViewController(viewController, animated: animated)
}
// MARK: - Private Properties
fileprivate var duringPushAnimation = false
}
// MARK: - UINavigationControllerDelegate
extension SwipeNavigationController: UINavigationControllerDelegate {
func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) {
guard let swipeNavigationController = navigationController as? SwipeNavigationController else { return }
swipeNavigationController.duringPushAnimation = false
}
}
// MARK: - UIGestureRecognizerDelegate
extension SwipeNavigationController: UIGestureRecognizerDelegate {
func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
guard gestureRecognizer == interactivePopGestureRecognizer else {
return true // default value
}
// Disable pop gesture in two situations:
// 1) when the pop animation is in progress
// 2) when user swipes quickly a couple of times and animations don't have time to be performed
if (self.visibleViewController?.isKind(of: CheckOTPViewController.self))! {
return false
}
if (self.visibleViewController?.isKind(of: ForgotPasswordViewController.self))! {
return false
}
return viewControllers.count > 1 && duringPushAnimation == false
}
}
您可以尝试使用以下检查iOS 13的条件来检查pop视图控制器:
if #available(iOS 13.0, *) {
self.navigationController?.popToViewController(vc as! YourVC, animated: true)
} else {
// Fallback on earlier versions
}
您必须查看iOS 13附带的UINavigationController更改:
经过多次尝试,我终于解决了这个问题。 问题是调用deinit方法,而没有在viewDidLoad方法上设置正确的委托 下面是工作代码
import UIKit
class SwipeNavigationController: UINavigationController {
// MARK: - Lifecycle
override init(rootViewController: UIViewController) {
super.init(rootViewController: rootViewController)
}
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
self.setup()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.setup()
}
private func setup() {
delegate = self
interactivePopGestureRecognizer?.delegate = self
navigationItem.backBarButtonItem?.isEnabled = true
interactivePopGestureRecognizer?.isEnabled = true
}
override func viewDidLoad() {
super.viewDidLoad()
// This needs to be in here, not in init
setup()
}
// MARK: - Overrides
override func pushViewController(_ viewController: UIViewController, animated: Bool) {
duringPushAnimation = true
super.pushViewController(viewController, animated: animated)
}
// MARK: - Private Properties
fileprivate var duringPushAnimation = false
}
// MARK: - UINavigationControllerDelegate
extension SwipeNavigationController: UINavigationControllerDelegate {
func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) {
guard let swipeNavigationController = navigationController as? SwipeNavigationController else { return }
swipeNavigationController.duringPushAnimation = false
}
}
// MARK: - UIGestureRecognizerDelegate
extension SwipeNavigationController: UIGestureRecognizerDelegate {
func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
guard gestureRecognizer == interactivePopGestureRecognizer else {
return true // default value
}
// Disable pop gesture in two situations:
// 1) when the pop animation is in progress
// 2) when user swipes quickly a couple of times and animations don't have time to be performed
if (self.visibleViewController?.isKind(of: CheckOTPViewController.self))! {
return false
}
if (self.visibleViewController?.isKind(of: ForgotPasswordViewController.self))! {
return false
}
return viewControllers.count > 1 && duringPushAnimation == false
}
}
试试这个男人:请阅读——总结是,这不是一个理想的方式来解决志愿者,可能是反作用获得答案。请不要将此添加到您的问题中。谢谢,它很有效。但是您可以将deinit保留在适当的位置,它不会影响逻辑。