0

Итак, у меня есть два монитора просмотра, которые отображаются одновременно. Цель состоит в следующем: когда я нажимаю меню, он возвращает индекс. Это уведомит другой экран, который необходимо обновить.NSNotification userinfo сохраняет штабелирование при нажатии кнопок

Я делаю следующее:

контроллера (меню)

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

Найдено правильный ответ себя. Очевидно, все, что мне нужно было сделать, это добавить NotificationCenter в ViewWillAppear и удалить его в ViewWillDisappear. Когда я переключаюсь в меню между представлениями (что в 4 раза больше того же вида), оно возвращает только одно значение.

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. Вместо этого используйте его в viewDidLoad, который выполняется только после, когда загружается контроллер вида.
И вы должны назвать его в

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

Это фактически укладка. Я очистил консоль после моего третьего нажатия, и на 4-м я получил SearchResults теперь показывает индекс: Необязательно (3) SearchResults теперь показывает индекс: Необязательно (3) SearchResults теперь показывает индекс: Необязательно (3) SearchResults теперь показывает индекс: Необязательно (3) – SoundShock

+0

Словарь по-прежнему содержит только одно значение, но вы многократно увольняете сообщение. Если вы остановите функцию didReceiveNotification, я угадываю ее цикличность несколько раз для каждой кнопки. Как выглядит код, который делает сообщение? – Haligen

+0

Добавил код на вопрос. Это функция от CarbonKit, но если я проверю ее с помощью NSLog, она вызывает только этот индекс – SoundShock

0

Если вы просто хотите, чтобы последний клике индекс просто объявить переменную в классе и установить индекс на этой переменной, так что вы получите последнее Clicked индексировать каждый раз, когда вы извлекаете его

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)") 
} 
Смежные вопросы