0

私は同時に2つのビューコントローラーを持っています。目標は次のとおりです。メニューを押すと、インデックスが返されます。これにより、更新が必要な他の画面に通知されます。NSNotificationのuserinfoは、ボタンを押したときに積み重ね続けます。

私は次のことをやっている:

コントローラA(メニュー)

func carbonTabSwipeNavigation(carbonTabSwipeNavigation: CarbonTabSwipeNavigation, didMoveAtIndex index: UInt) { 
    //NSLog("Did move at index: %ld", index) 
     //NSNotification to send data 
     NSNotificationCenter.defaultCenter().postNotificationName(NotificationNames.GetIndexCarbonKit, object: nil, userInfo: ["clickedIndex" : Int(index)]) 
} 

コントローラーB(受信機)

override func viewWillAppear(animated: Bool) { 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(SearchResults.didReceiveNotification(_:)), name: NotificationNames.GetIndexCarbonKit, object: nil) 
} 


func didReceiveNotification(notification: NSNotification) { 
    let index:Dictionary<String,Int> = notification.userInfo as! Dictionary<String,Int> 
    let messageFromNotification = index["clickedIndex"] 
    print(" SearchResults now shows index: \(messageFromNotification)") 
} 

私の問題は、以下の通りである。ここで辞書私はインデックスをAからBに送り、積み重ねています。私は、メニューを複数回押すのであれば、私の出力は次のようになります。

SearchResults now shows index: Optional(0) 
SearchResults now shows index: Optional(1) 
SearchResults now shows index: Optional(1) 
SearchResults now shows index: Optional(2) 
SearchResults now shows index: Optional(2) 
SearchResults now shows index: Optional(2) 
SearchResults now shows index: Optional(3) 
SearchResults now shows index: Optional(3) 
SearchResults now shows index: Optional(3) 
SearchResults now shows index: Optional(3) 
SearchResults now shows index: Optional(1) 
SearchResults now shows index: Optional(1) 
SearchResults now shows index: Optional(1) 
SearchResults now shows index: Optional(1) 
SearchResults now shows index: Optional(1) 

どのように私は最後のインデックスを得ることができますか?私は他のスタックを必要としません。

答えて

1

が正しい答えを見つけることが、あなたのクラスの変数を宣言して、最後のクリックされたインデックスを毎回取得しますので、あなたはそれを取得し、その変数にインデックスを設定したい場合私自身。どうやら、ViewWillAppearにNotificationCenterを追加し、ViewWillDisappearでそれを削除するだけでした。ビュー間でメニューを切り替えると(同じビューの4倍)、値が1つだけ戻されます。

override func viewWillAppear(animated: Bool) { 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(SearchResults.didReceiveNotification(_:)), name: NotificationNames.GetIndexCarbonKit, object: nil) 
} 

override func viewWillDisappear(animated: Bool) { 
    NSNotificationCenter.defaultCenter().removeObserver(self) 
} 

func didReceiveNotification(notification: NSNotification) { 
    let index:Dictionary<String,Int> = notification.userInfo as! Dictionary<String,Int> 
    self.currentIndex = (index.first?.1)! 
    print(currentIndex) 
} 
0

viewdidappearで使用しないでください!これは、ViewControllerで複数回呼び出されるメソッドです。その代わりに、でそれを実行します。これは、ビューコントローラがロードされたときに実行されるのはです。
そして、あなたは

func didReceiveNotification(notification: NSNotification) 

と関数の使用後にそれを呼び出す必要があります:

deinit { 
NSNotificationCenter.defaultCenter().removeObserver(self) 
} 
+0

ありがとう、私はそれを変更しました。まだ積み重ねることから辞書を止めることはありません。 – SoundShock

+0

私の編集した答えをチェックしてください。 viewDidLoadでも呼び出さないでください。 – Dershowitz123

+0

'func didReceiveNotification'はオブザーバを追加した後にのみ呼び出されるので、私はそれを行うことはできません。したがって、NSNotificationCenter.defaultCenter()。addObserver(self、selector:#selector(SearchResults.didReceiveNotification(_ :)) – SoundShock

0

辞書には、実際に積み重ねるか、単にコンソールウィンドウの出力ということですされていますか?メニューボタンを押すたびにコンソールウィンドウをクリアして、何が起きているのかを確認してください。インデックスはその関数にスコープされるので、その関数が終了するとインデックスは消えます。

+0

実際には積み重なっています。 (3) SearchResultsがインデックスを表示する:オプション(3) SearchResultsがインデックスを表示する:オプション(3) SearchResultsがインデックスを表示する:オプション(3) – SoundShock

+0

辞書には1つの値しか含まれていませんが、通知は複数回送信されます。 didReceiveNotification関数をブレークポイントすると、私は各ボタンを押すたびにサイクルを数回推測しています。ポストはどのようなコードに見えますか? – Haligen

+0

質問にコードを追加しました。これはCarbonKitの関数ですが、NSLogで調べると、そのインデックスを一度呼び出すだけです – SoundShock

0

あなただけの最後にクリックされたインデックスはちょうど

func didReceiveNotification(notification: NSNotification) { 
    let index:Dictionary<String,Int> = notification.userInfo as! Dictionary<String,Int> 
    self.messageFromNotification = index["clickedIndex"] 
    print(" SearchResults now shows index: \(messageFromNotification)") 
} 
関連する問題