Swift截图观察者执行次数viewController每次会话被查看(不是它应该的一次)

时间:2016-01-02 21:44:58

标签: ios swift nsnotificationcenter


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

let mainQueue = NSOperationQueue.mainQueue()
NSNotificationCenter.defaultCenter().addObserverForName(UIApplicationUserDidTakeScreenshotNotification,
        object: nil,
        queue: mainQueue) { notification in
            print("SCREENSHOT TAKEN")

    }

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

2 个答案:

答案 0 :(得分:1)

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

这样做的方法是将以下内容添加到viewDidLoad(或者添加到viewWillAppear中,或者更适合导航流程中):

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(didTakeScreenshot), name: UIApplicationUserDidTakeScreenshotNotification, object: nil)

(你应该用你想要的方法替换didTakeScreenshot的名字)

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

NSNotificationCenter.defaultCenter().removeObserver(self) 

(删除所有观察员)

NSNotificationCenter.defaultCenter().removeObserver(self, name: UIApplicationUserDidTakeScreenshotNotification, object: nil)

(仅用于移除特定观察者)

答案 1 :(得分:0)

我知道这是很久以前的问题,但这是答案,以防有人遇到同样的问题。最简单的答案是覆盖方法viewDidAppear并在那里订阅您的通知,并覆盖viewWillDisappear并取消订阅那里的通知。这样,如果你去视图控制器,你订阅,如果你离开,你取消订阅。在我看来,在viewDidLoad订阅是不好的。原因是每次出现视图时都不会调用viewDidLoad。如果之前没有加载视图控制器,Swift只会调用该方法,因此,如果您在消失时取消订阅,但在订阅时不订阅,则不会订阅,因为viewDidLoad将不会被调用。