Уведомление, когда NSPopupButton меняет свое значение в какао XCode5
Я хочу знать, если это метод, отличный от
-(void)menu:(NSMenu *)menu willHighlightItem:(NSMenuItem *)item
а также
-(void)menuDidClose:(NSMenu *)menu
чтобы помочь мне узнать, когда изменяется выбранное значение NSPopupButton (например, нажимая имя ключа вместо его выбора из NSMenu)
2 ответа
Решение
Сначала создайте свой IBAction:
- (IBAction)mySelector:(id)sender {
NSLog(@"My NSPopupButton selected value is: %@", [(NSPopUpButton *) sender titleOfSelectedItem]);
}
а затем назначьте свой IBAction вашей NSPopupButton
[popupbutton setAction:@selector(mySelector:)];
[popupbutton setTarget:self];
Комбинированное решение (работает только на iOS 13 и выше)
Я пробовал наблюдать
indexOfSelectedItem
свойство NSPopupButton, но он не совместим с KVO.
Теперь, поскольку NSPopupButton внутренне использует NSMenu, я попытался найти соответствующие уведомления, которые отправляет NSMenu, и обнаружил, что
NSMenu.didSendActionNotification
может быть использован.
import Combine
extension NSPopUpButton {
/// Publishes index of selected Item
var selectionPublisher: AnyPublisher<Int, Never> {
NotificationCenter.default
.publisher(for: NSMenu.didSendActionNotification, object: menu)
.map { _ in self.indexOfSelectedItem }
.eraseToAnyPublisher()
}
}
Это расширение публикует индекс всякий раз, когда пользователь делает какой-либо выбор в NSPooupButton.
Его можно использовать следующим образом
popupButton.selectionPublisher.sink { (index) in
print("Selecion \(index)")
}
.store(in: &storage)