Swift 屏幕截图观察者执行每个会话查看 viewController 的次数(而不是应有的一次)

atl*_*887 5 nsnotificationcenter ios swift


我正在使用这个函数来检测 Swift 中的屏幕截图:

    let mainQueue = OperationQueue.main
    NotificationCenter.default.addObserver(forName: UIApplication.userDidTakeScreenshotNotification,
            object: nil,
            queue: mainQueue) { notification in
                print("[!]detected screenshot")
        }
Run Code Online (Sandbox Code Playgroud)

它位于 viewDidLoad() 中,每次我访问 viewController 时,它都会添加另一个屏幕截图观察器。因此,如果我在同一个会话中访问视图控制器两次,那么当我截图时它会执行两次。如果我要访问视图控制器,该函数将运行四次,那么屏幕截图观察者将执行四次。如何防止在视图控制器会话之间重新声明它?感谢您的帮助。

27 *_*ril 3

问题是,我们在互联网上运行的屏幕截图观察器的每个示例似乎都使用主队列。这是一种误导,因为这意味着观察者被添加到更通用的上下文中,而不是您想要的视图控制器上下文中。

执行此操作的方法是将以下内容添加到 viewDidLoad (或 viewWillAppear,或更适合您的导航流程的任何一个):

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(didTakeScreenshot), name: UIApplicationUserDidTakeScreenshotNotification, object: nil)
Run Code Online (Sandbox Code Playgroud)

(您应该将 didTakeScreenshot 替换为您想要的方法的名称)

然后,在 deinit(或 viewDidDisappear...)上,您应该删除观察者:

NSNotificationCenter.defaultCenter().removeObserver(self) 
Run Code Online (Sandbox Code Playgroud)

(用于删除所有观察者)

NSNotificationCenter.defaultCenter().removeObserver(self, name: UIApplicationUserDidTakeScreenshotNotification, object: nil)
Run Code Online (Sandbox Code Playgroud)

(仅用于删除该特定观察者)