我在快速协议(protocol)中使用@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
协议(protocol),让屏幕更容易追踪。
但是有一个问题。
#selecor 上的 registerObserver() 方法要求将 @objc 添加到 trackScreenshot 方法,但如果我这样做,Xcode 会在 trackScreenshot() 行上提示并告诉:@objc can only be used with members of classes, @objc protocols, and concrete extensions类
有办法解决这个问题吗? 还试过:
NotificationCenter.default.addObserver(forName: UIApplication.userDidTakeScreenshotNotification, object: nil, queue: nil) { _ in
print(self.screenName.rawValue)
}
但它不起作用,并且观察者不能被移除并保留在圆圈中,因此在打开新屏幕时打印所有以前的屏幕名称。
欢迎任何帮助!提前致谢!
最佳答案
我会使用通知观察的闭包形式而不是选择器/方法:
protocol TrackScreenshot {
func registerObserver(handler: (()->Void)?)
func removeObservers()
}
extension TrackScreenshot where Self: ScreenTracking {
func registerObserver(handler: (()->Void)?) {
NotificationCenter.default.addObserver(forName: UIApplication.userDidTakeScreenshotNotification, object: nil, queue: nil) { (notification) in
handler?()
}
}
func removeObservers() {
NotificationCenter.default.removeObserver(self, name: UIApplication.userDidTakeScreenshotNotification, object: nil )
}
}
那么你的用法是这样的:
self.registerObserver { [weak self] in
guard let self = self else {
return
}
print("Screen shot")'
}
关于ios - 在 Swift 5 协议(protocol)中使用 @objc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68182073/