我遇到了奇怪的行为。我可以说的最好的方法是…当超类已经符合协议(通过扩展名)时,不调用类扩展中的未重写协议方法。但是,只有在使用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
中不使用扩展来实现协议一致性方法,而只是使用常规方法代替(将实现协议的方法放入类中),我可以解决问题。 。
问题是……怎么来了?
答案 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
}
}