在特定条件下不会调用类扩展中的协议方法

时间:2019-06-18 09:16:09

标签: swift protocols swift-protocols swift-extensions swift5

我遇到了奇怪的行为。我可以说的最好的方法是…当超类已经符合协议(通过扩展名)时,不调用类扩展中的未重写协议方法。但是,只有在使用release构建配置进行构建时,这种情况才会发生。

class A: UIViewController {}

extension A: UIScrollViewDelegate {
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        print("scrollViewDidScroll in superclass")
    }
}

class B: A {
    // A tableView (and its data source and delegate) is set here…
}

extension B: UITableViewDelegate {
    override func scrollViewDidScroll(_ scrollView: UIScrollView) {
        super.scrollViewDidScroll(scrollView)
        print("scrollViewDidScroll in subclass")
    }

    func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
        print("scrollViewDidEndDragging")
    }
}
  

输出:

     

超类中的scrollViewDidScroll

     

scrollViewDidScroll在子类中

     

scrollViewDidEndDragging

但是,如果我使用release构建配置进行构建,则输出为

  

超类中的scrollViewDidScroll

     

scrollViewDidScroll在子类中

如果我不在类B中不使用扩展来实现协议一致性方法,而只是使用常规方法代替(将实现协议的方法放入类中),我可以解决问题。

问题是……怎么来了?

1 个答案:

答案 0 :(得分:0)

我也遇到了同样的行为。

Xcode 版本 - 12.4 Swift 版本 - 4.2

我还遇到只有在应用程序中调用 applicationDidBecomeActive 方法时才会显示此行为。(主要是当您导航到其他屏幕(如身份验证等)时)

修复:您需要再次将 ViewController 指定为委托。

func applicationDidBecomeActive(_ application: UIApplication) {

    fixesForCallBackInExt()
}

func fixesForCallBackInExt() {
    guard  let navController = window?.rootViewController as? UINavigationController else { return }
    if let tabVC = navController.topViewController as? UITabBarController, let topVC = tabVC.selectedViewController, topVC.isKind(of: UIViewController.self) {
        // Set Your Delegate = topVC
    } else if let topVC = navController.topViewController, topVC.isKind(of: UIViewController.self) {
        // Set Your Delegate = topVC
    }
}