2017-10-31 10 views
0

私は2つのViewControllerを持っています:ViewControllerSecondViewControllerです。 この2つのViewControllerにオブザーバを追加しました。 ViewControllerには、通知を送信するためのIBActionも定義しました。両方のViewControllerのクロージャを使用して通知を処理します。しかし、ViewControllerのクロージャが呼び出されるだけです。 SecondViewControllerのクロージャ(とコード全体)が呼び出されない(私はデバッガでチェックした)。クロージャーにはprintステートメントのみが含まれています。 は、ここでのViewControllerでの閉鎖が呼び出されますが、SecondViewControllerでの閉鎖はしていません、私のコードはScondViewControllerObserverがNotificationCenter Swift 4.0を使用して呼び出されない

//SecondViewController 
import UIKit 

class SecondViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let nc = NotificationCenter.default 
     nc.addObserver(forName: Notification.Name(rawValue:"MyNotification"), object: nil, queue: nil) { (notification) in 
      print("I'm the: \(type(of: self))") 
     } 
    } 
} 

//ViewController 
import UIKit 

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let nc = NotificationCenter.default 
     nc.addObserver(forName: Notification.Name(rawValue:"MyNotification"), object: nil, queue: nil) { (notification) in 
      print("I'm the : \(type(of: self))") 
     } 
    } 

    @IBAction func sendNotification(_ sender: UIButton) { 
     let nc = NotificationCenter.default 
     nc.post(name: Notification.Name(rawValue:"MyNotification"), object: nil, userInfo: ["message":"Hello there!", "Date:":Date()]) 

    } 
} 

されます。たぶん、理由は、通知を投稿する前にSecondViewControllerが初期化されないということです。しかし、ソリューションはどのように見えますか? 何か助けていただければ幸いです。

+0

通知を送信/送信すると、メモリ内のSecondViewControllerインスタンスですか? –

+0

これは呼び出されません。遅れてこの通知を掲示する必要があります。 – Mannopson

+0

私は投稿する前にSVCが初期化されていないので、呼び出されません。デフォルトのinitを呼び出すために 'ViewController'のviewDidLoadに' let svc = SecondViewController() 'を追加しましたが、これは効果がありません。 SVCのクロージャが呼び出されていません。誰かが回避策を知っていますか? – user1895268

答えて

0

これが1対1の関係である場合は、代わりに代理パターンを使用することもできます。あなたが正しいとはいえ、あなたは投稿の前に初期化していないので、通知オブザーバはまだ呼び出されていません。そのため、SecondViewControllerで関数を呼び出す理由があってはなりません。

したがって、変数値を更新する必要がある場合は、両方のViewControllerがアクセスできるクラスVariablesのクラスのどこかでそれを行うことができます。

+0

はい私はこれを非常に簡単な方法で行うことができました。実際には私は5 ViewControllerを持っている私は通知したい。私はそれを単純にし、基本的な仕組みを理解したかったので、私は2つのクラスを投稿しました。 – user1895268

+0

@ user1895268残りのviewControllerから取得するのは難しいです。すぐに通知された通知 – Mannopson

+0

私は非常に簡単な方法でそれを解決する方法を見つけました。オブザーバーを追加するためのコードは、viewDidLoad内にあるべきではありません。代わりに 'SecondViewController'でクラスfunc' class func setObserver() 'を作成しました。私の 'viewController'では、' viewDidLoad'の中で私は 'SecondViewController.setObserver()'を追加しました。それはそのトリックです。あなたのコメントをありがとう – user1895268

関連する問題