我在使用 Swift 协议中的 @objc 代码时遇到了问题,想知道是否有解决方法。
目前我的代码如下:
import UIKit
@objc
protocol TrackScreenshot {
func registerObserver()
func removeObservers()
}
extension TrackScreenshot where Self: ScreenTracking {
func registerObserver() {
NotificationCenter.default.addObserver(self, selector: #selector(trackScreenshot), name: UIApplication.userDidTakeScreenshotNotification, object: nil)
}
func removeObservers() {
NotificationCenter.default.removeObserver(self, name: UIApplication.userDidTakeScreenshotNotification, object: nil )
}
func trackScreenshot() {
print(screenName.rawValue)
}
}
我想继承 TrackScreenshot
协议,使得截图可以轻松进行跟踪。
但是,这里有一个问题。
在 #selector 上注册观察者的 registerObserver() 方法要求在 trackScreenshot 方法上添加 @objc,但如果我这样做,Xcode 会在 trackScreenshot() 行上报错并告诉我:@objc 只能用于类的成员、@objc 协议以及类的具体扩展。
有没有一种方法可以解决这个问题呢? 也尝试过:
NotificationCenter.default.addObserver(forName: UIApplication.userDidTakeScreenshotNotification, object: nil, queue: nil) { _ in
print(self.screenName.rawValue)
}
但是它并没有起作用,观察者无法被移除并留在圈子里,所以在打开新屏幕时会打印出所有先前的屏幕名称。
任何帮助都非常欢迎!提前感谢!
NSObjectProtocol
协议即可解决问题。 - Schottky@objc protocol TrackScreenshot : NSObject { ... }
- Ol Sen