2016-07-11 17 views
7

現在、Swift 3では新しい通知は機能していませんか?カスタムビューのtouchesBegan()内SwiftのNSNotifications 3

NotificationCenter.default().post(name: DidTouchParticleView, 
            object: self.particle as? AnyObject) 

と私は1つがある場合は、ビューコントローラにparticleオブジェクトを送信する必要があります。私がやっています。だから私はこれを行う:

NotificationCenter.default().addObserver(forName: DidTouchParticleView, 
             object: self, 
             queue: OperationQueue.main(), 
             using: presentParticleDisplayView(notification:)) 

ビューコントローラのviewDidLoad()で。私はその特定のビューコントローラが私のカスタムビューをタップするときに提示されたものだと確信していますが、関数presentParticleDisplayView(notification:)は決して呼び出されません。

また、DidTouchParticleViewは、次のようにグローバルに定義されています

let DidTouchParticleView = NSNotification.Name("didTouchParticleView") 

はベータ版のためにこれは、あるいは私が何か間違ったことをやっていますか?

+0

現在のベータ版とSwift 3では、 'default()'の後のカッコが削除されています。それは 'NotificationCenter.default'です。 – matt

答えて

11

第2パラメータメッセージ(selector:)が最初のパラメータ(ターゲット)に送信されるaddObserver(_:selector:name:object:)を呼び出すつもりであるようです。

代わりに、間違ったメソッドaddObserver(forName:object:queue:using:)を呼び出していますが、これは全く違った動作をします。あなたの質問の後半部分にとしても

、:

let DidTouchParticleView = NSNotification.Name("didTouchParticleView") 

正しい(ほぼ)です。それがあります

すべての通知名は今Notification.Nameインスタンスです。

extension Notification.Name { 
    static let didTouchParticleView = Notification.Name("didTouchParticleView") 
} 

あなたは、あなたのコード全体.didTouchParticleViewとして、通知の名前を参照することができます。これを行うための適切な方法はと言うことです。

1

通知(object: self)を投稿するには、あなた自身が監視しています。 か、コールの中にはおそらくのようなものがあるかもしれません(ただし、それがハンドラの正しいパーティクルであることを確認することに注意してください)。この方法のドキュメントをもう一度読んで、objectのパラメータが何であるか注意深くメモしてください。

このバージョンのaddObserverはオブザーバオブジェクトを返します。後でremoveObserverと呼ぶことができるように格納する必要があります。

+0

'object'をnilに変更するとそれを解決します。しかし、それはどのようにオブザーバーになったのかをどのように知っていますか?以前Swift 2では、オブジェクトをオブザーバとして受け取る 'addObserver:'がありました。 –

+1

@YoussefSamiいいえ、あなたは前に何が起こっていたのか理解できませんでした。オブジェクトはオブザーバーではありませんでした。オブザーバーは、コールから_復帰しました。これを 'addObserver(_:selector:name:object:)'と混同しないでください。最初のパラメータはオブザーバです。私の編集された答えを見てください。 – matt

+0

@mattはい、それは私が言及していたものです。では、通知センタは通知を送信するオブジェクトをどのように知るようになりましたか? –