Уведомление, когда NSPopupButton меняет свое значение в какао XCode5

Я хочу знать, отличается ли этот метод от

-(void)menu:(NSMenu *)menu willHighlightItem:(NSMenuItem *)item

а также

-(void)menuDidClose:(NSMenu *)menu

чтобы помочь мне узнать, когда изменяется выбранное значение NSPopupButton (например, нажав имя клавиши вместо выбора его из NSMenu)


person Jesus    schedule 28.08.2014    source источник


Ответы (2)


сначала создайте свой IBAction:

- (IBAction)mySelector:(id)sender {
    NSLog(@"My NSPopupButton selected value is: %@", [(NSPopUpButton *) sender titleOfSelectedItem]);
}

а затем назначьте свой IBAction вашему NSPopupButton

    [popupbutton setAction:@selector(mySelector:)];
    [popupbutton setTarget:self];
person Jesús Ayala    schedule 28.08.2014

Комбинированное решение (работает только на 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()
    }
}

Это расширение публикует индекс всякий раз, когда пользователь делает какой-либо выбор в NSPopupButton.

Его можно использовать следующим образом

popupButton.selectionPublisher
    .sink { (index) in
        print("Selecion \(index)")
    }
    .store(in: &storage)
person Kaunteya    schedule 24.04.2021