ios - 在 Swift 5 协议(protocol)中使用 @objc

标签 ios swift objective-c nsnotificationcenter

我在快速协议(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/

相关文章:

ios - ns 计时器重复创建 2-3 次

ios - TableView :dequeueReusableCellWithIdentifier issues with "global" constant

swift - Firebase 聊天 - 通知其他用户

ios - 如何使用 Swift Codable 处理部分动态的 JSON?

iOS UISegmentedControl 无法以编程方式定位

ios - 在 tableView 中重新加载后保持滚动位置

iphone - 如何在 iPhone/Objective C 上找出 RSA 公钥的模数和指数

ios - 执行自动转场

ios - 设备日志未出现在 Xcode 中

ios - 如何将多个选定的 TableView 单元格数据传输到 Swift 中的下一个 View Controller ?