【问题标题】:Unrecognised selector sent to instance by NSNotificationCenterNSNotificationCenter 发送到实例的无法识别的选择器
【发布时间】:2015-10-17 23:00:09
【问题描述】:

当我想通过 NSNotificationCenter 更新标签时,会出现运行时错误,但我不知道为什么。选择器的名称相同。

ViewController2

@IBAction func saveSettings(sender: UIButton) {
    NSNotificationCenter.defaultCenter().postNotificationName("TimeRepairID", object: nil)
}

视图控制器

    override func viewDidLoad() {
    super.viewDidLoad()
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "setTimeRepair", name: "TimeRepairID", object: nil)  
}

func setTimeRepair(notification: NSNotification){
    CurrentTimerepair.text = String(format:"%.1f", RepairTime.sharedInstance.TimeOfRepair())
    RFPTime.text = String(RepairTime.sharedInstance.ReadyForPickup())
}

所以每次我按下 ViewController2 中的保存按钮时,应用程序都会崩溃,因为发送到实例 0x13e63bd40 的选择器无法识别

【问题讨论】:

  • 查看代码,你错过了:在选择器名称之后。
  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。 完整错误信息是什么?

标签: ios objective-c swift


【解决方案1】:

当您将 NSNotification 作为参数传递时,您在选择器名称后错过了 :

override func viewDidLoad() {
    super.viewDidLoad()
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "setTimeRepair:", name: "TimeRepairID", object: nil)
}

func setTimeRepair(notification: NSNotification){
    CurrentTimerepair.text = String(format:"%.1f", RepairTime.sharedInstance.TimeOfRepair())
    RFPTime.text = String(RepairTime.sharedInstance.ReadyForPickup())
}

【讨论】:

  • 只有当它有参数时
  • 记得在 deinit 或 viewDidDisappear 方法中将自己移除为观察者,例如:deinit { NSNotificationCenter.defaultCenter().removeObserver(self) }
  • 我必须在哪里实现 deinit ?在视图控制器中? @mofojed
  • 是的,参见示例:natashatherobot.com/…
猜你喜欢
  • 2019-08-28
  • 2012-07-24
相关资源
最近更新 更多