为什么 NotificationCenter.observer 没有收听通知

why NotificationCenter.observer is not listening to notifications

大家好,我是 iOS 开发的新手,仍在学习

我有三个视图控制器,viewController,SViewController,TViewController

SviewController 我有点击按钮的通知 sender.post 方法

in viewController, TViewController viewdidload() 方法我有 .addobserver() 方法

当我点击 SViewController 上的按钮和 post 通知时

View Controller 的选择器被执行,而不是 TviewController

我已经在 FirstVC 中加载了 TviewController,即仅 ViewController viewdidload() 方法

由于 segue 使用另一个按钮再次执行从 SviewController 到 TviewController 的 viewdidload() ,我尝试将完成处理程序字符串分配给全局变量,以便它的值保持不变并打印它(更改值)再次加载视图时,然后我才知道完成处理程序根本没有执行这里是代码

ViewController

import UIKit

extension Notification.Name{
    static var fnote = Notification.Name("fnote")
}

class ViewController: UIViewController {
@IBOutlet weak var label: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()
 
    NotificationCenter.default.addObserver(self, selector: #selector(fhandle(notification:)), name: .fnote, object: nil)
    
    let storyboad = UIStoryboard(name: "Main", bundle: nil)
    let tvc = storyboad.instantiateViewController(identifier: "1") as! TViewController
    
    let _ = tvc.view
    print(tvc.isViewLoaded)
    
    print("journey")
}

@objc func fhandle(notification:Notification){
    label.text = "Haii welcome to the hyderabad"
}


}

SViewController

import UIKit
var temp:String = "HHH"

class SViewController: UIViewController {

 
 
    @IBAction func click(_ sender: Any) {
        
        NotificationCenter.default.post(name: .fnote, object: nil)
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }
}

TviewController

import UIKit



class TViewController: UIViewController {

    @IBOutlet weak var label2: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()

        NotificationCenter.default.addObserver(self, selector: #selector(handler(notification:)) , name: .fnote, object: nil)
       
        print(temp)
        print("happy")
    }

   @objc func handler(notification:Notification)
    {
        print("jackson")
        label2.text = "Hurray"
        temp = label2.text ?? "Nothing"
    }
}

有人可以帮我解决这个问题吗

let storyboad = UIStoryboard(name: "Main", bundle: nil)
let tvc = storyboad.instantiateViewController(identifier: "1") as! TViewController
let _ = tvc.view
print(tvc.isViewLoaded)

这不是测试通知的方法。从“ViewController”控制器推送“TViewController”控制器。然后 post 来自目标控制器的通知。

您没有显示或解释您将在何处/何时/如何显示 TViewController 的视图,但要解释 第一个 事情您'你做错了...

在此代码中:

override func viewDidLoad() {
    super.viewDidLoad()
 
    NotificationCenter.default.addObserver(self, selector: #selector(fhandle(notification:)), name: .fnote, object: nil)
    
    let storyboad = UIStoryboard(name: "Main", bundle: nil)
    let tvc = storyboad.instantiateViewController(identifier: "1") as! TViewController
    
    let _ = tvc.view
    print(tvc.isViewLoaded)
    
    print("journey")
}

一旦 viewDidLoad() 完成(即紧接在 print("journey") 行之后),您的 TViewControllertvc 实例将被销毁。也就是说,它已从内存中转储,其中的代码无法执行,因为它已不存在。

这就是所谓的“超出范围”。

因此,当您尝试 post 来自 SViewController 的通知时,不存在 TViewController 因此它的代码不是 运行 “观察”通知.

这是一个非常简单的多个视图控制器观察通知的例子:

当你pushViewControllerTViewController时,你得到一个新的TViewController实例,而ViewController的原始实例仍然存在。

当你 pushTViewControllerSViewController 时,你会得到 SViewControllerboth ViewControllerTViewController 仍然存在。

当您点击“Post”按钮时,ViewControllerTViewController 将分别执行您指定的函数以观察通知。

当您返回 TViewController 时,您会看到其标签文本已更改,当您返回 ViewController 时,您会看到其标签文本也已更改。

请注意,如果您随后再次推送到 TViewController,您会得到一个 新实例 并且它的标签将会返回在原文中。

extension Notification.Name{
    static var fnote = Notification.Name("fnote")
}

class ViewController: UIViewController {
    
    @IBOutlet weak var label: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        NotificationCenter.default.addObserver(self, selector: #selector(fhandle(notification:)), name: .fnote, object: nil)
        print("journey")
    }
    
    @objc func fhandle(notification:Notification) {
        print("Got it!")
        label.text = "Haii welcome to the hyderabad"
    }
    
}

class TViewController: UIViewController {
    
    @IBOutlet weak var label2: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        NotificationCenter.default.addObserver(self, selector: #selector(handler(notification:)), name: .fnote, object: nil)
        print("happy")
    }
    
    @objc func handler(notification:Notification) {
        print("jackson")
        label2.text = "Hurray"
    }

}

class SViewController: UIViewController {

    @IBOutlet var infoLabel: UILabel!
    
    @IBAction func click(_ sender: Any) {
        NotificationCenter.default.post(name: .fnote, object: nil)
        infoLabel.text = "Notification Posted"
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
}