Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何读取通知观察者_Ios_Swift_Notificationcenter - Fatal编程技术网

Ios 如何读取通知观察者

Ios 如何读取通知观察者,ios,swift,notificationcenter,Ios,Swift,Notificationcenter,因此,我在一个特定的视图控制器中添加了大约四个通知观察者,但如果满足某个条件,我想删除其中一个,然后将其添加回另一个条件。我能够删除特定的观察者,但我无法将其重新添加。除了一个被移除并添加回来的,其他的都可以工作,我知道它可以工作,因为当VC加载并且添加了所有的通知观察者时,它会在添加回来后停止工作。这是我的密码: //在ViewDidDisplay中注册观察者,这将注册我的蓝牙设备,每当我点击蓝牙设备按钮时,就会调用此功能 NotificationCenter.default.addObse

因此,我在一个特定的视图控制器中添加了大约四个通知观察者,但如果满足某个条件,我想删除其中一个,然后将其添加回另一个条件。我能够删除特定的观察者,但我无法将其重新添加。除了一个被移除并添加回来的,其他的都可以工作,我知道它可以工作,因为当VC加载并且添加了所有的通知观察者时,它会在添加回来后停止工作。这是我的密码:


//在ViewDidDisplay中注册观察者,这将注册我的蓝牙设备,每当我点击蓝牙设备按钮时,就会调用此功能
NotificationCenter.default.addObserver(
self,selector:#selector(Myclass.deviceTapped),name:Notification.name(“BluetoothReceivedNotificationName”),object:nil)
//我把观察者移到这里
如果条件==false{
NotificationCenter.default.removeObserver(self,name:Notification.name(“BluetoothReceivedNotificationName”),对象:nil)
}  
//然后用这个再加回去
NotificationCenter.default.addObserver(
self,selector:#selector(Myclass.deviceTapped),name:Notification.name(“BluetoothReceivedNotificationName”),object:nil)
//在添加此^back之后,不再调用deviceTapped函数

在这些情况下,要做的事情是向自己证明这是正常工作的。这样,你就可以追踪到你正在做的阻止它工作的事情

例如,可能在任何通知有机会到达之前,
self
就不存在了。。。?也许您还没有显示的其他代码正在再次注销您的注册。。。?我确实经历过这样的困惑!它们可能很难调试

但不管有什么解释,您首先需要确保注销通知,然后重新注册通知不是问题

这是一个测试应用程序。它有三个按钮:注册、取消注册和通知。代码如下:

let notif : Notification.Name = .init("howdy")
@objc func gotNotified() {
    print("got notified")
}
@IBAction func doRegister(_ sender: Any) {
    NotificationCenter.default.addObserver(self, selector: #selector(gotNotified), name: notif, object: nil)
}
@IBAction func doUnregister(_ sender: Any) {
    NotificationCenter.default.removeObserver(self, name: notif, object: nil)
}
@IBAction func doNotify(_ sender: Any) {
    NotificationCenter.default.post(name: notif, object: nil)
}
因此,在连接按钮的情况下进行配置,然后:

  • 点击寄存器

  • 点击通知

  • 点击“取消注册”

  • 点击通知

  • 点击寄存器

  • 点击通知


  • 您将在2和6(而不是4)上看到,我们打印到控制台以证明我们收到了通知-正如您所期望的那样。

    您所做的只是显示一些骨架代码,显然是完全伪造的代码。请显示您的真实代码并解释“它停止工作”的含义(因为您没有显示任何会导致通知失败的内容)。@matt我刚刚编辑了我的帖子您是对的,我正在代码中的其他地方注销它谢谢您这么容易做,这么难调试!!!!很高兴你找到了。不使用通知中心的充分理由。:)