Уведомление, когда 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)
Другие вопросы по тегам