Подменю общего доступа NSSharingService

Как добавить подменю «Поделиться» в приложение для Mac? Например, Safari > Файл > Поделиться. Я ткнул в пример кода Apple SharingServices, но он не включает рабочий пункт меню.

введите здесь описание изображения

Прямо сейчас у меня есть кнопка, которая отображает средство выбора доступных служб обмена при нажатии:

NSMutableArray *shareItems = [NSMutableArray arrayWithObject:[self.noteSynopsisView string]];
NSSharingServicePicker *sharingServicePicker = [[NSSharingServicePicker alloc] initWithItems:shareItems];
sharingServicePicker.delegate = self;
[sharingServicePicker showRelativeToRect:[self.shareButton bounds] ofView:self.shareButton preferredEdge:NSMaxYEdge];

Я также определил элемент подменю «Общий доступ» в меню «Файл» для моего файла MainWindow.xib.

Насколько я понимаю, список NSSharingService формируется на лету. Поэтому я не могу на самом деле предопределить службы для пункта меню, который я создал в Interface Builder.

Спасибо за вашу помощь.


person DenVog    schedule 11.09.2012    source источник


Ответы (3)


Посмотрите на NSSharingService +sharingServicesForItems:. В методе -validateMenuItem: вы можете создать подменю, используя -title и -image возвращаемых им NSSharingServices. Свяжите каждую услугу с каждым пунктом меню и укажите действие каждого пункта меню на это:

- (IBAction)shareFromService:(id)sender {
  [[sender representedObject] performWithItems: arrayOfItemsToShare];
}

Это действительно очень просто. Apple хорошо поработала над этим.

person Mel    schedule 19.09.2012
comment
+1 Спасибо и от меня! Я смог сделать это в методе willOpen: delegate объекта NSMenu. - person regulus6633; 21.12.2012
comment
Вместо validateMenuItem это, вероятно, следует сделать в делегате menuNeedsUpdate:. Спасибо за направление. - person Peter N Lewis; 19.07.2017
comment
Я также отмечаю, что это не включает запись «Дополнительно», а не недавние записи, которые показывает NSSharingServicePicker. - person Peter N Lewis; 19.07.2017

Я считаю, что суть может помочь вам легко создать подменю соответствующих услуг. https://gist.github.com/eternalstorms/4132533

Это категория NSSharingServicePicker.

person 6 1    schedule 06.03.2013

Быстрая версия:

extension NSSharingServicePicker {
    
    class func menu(forSharingItems items: [AnyHashable]) -> NSMenu? {
        
        let sharingServices = NSSharingService.sharingServices(forItems: items)
        
        if sharingServices.isEmpty {
            return nil
        }
        
        let menu = NSMenu()
        
        for service in sharingServices {
            
            let item = MenuItem(label: service.title, action: #selector(_openSharingService), target: self, userInfo: ["sharingItems": items])
            
            item.image = service.image
            item.representedObject = service
            item.target = self
            menu.addItem(item)
            
        }
        
        return menu
        
    }
    
    @objc class private func _openSharingService(sender: MenuItem) {
        
        guard let items = sender.userInfo["sharingItems"] as? [AnyHashable], let service = sender.representedObject as? NSSharingService else {
            return
        }
        
        service.perform(withItems: items)
        
    }
    
}

class MenuItem: NSMenuItem {
    
    var userInfo: [String : Any] = [:]
    
    init(label: String, action: Selector?, target: AnyObject?, userInfo: [String : Any]) {
        self.userInfo = userInfo
        super.init(title: label, action: action, keyEquivalent: "")
    }
    
    required init(coder decoder: NSCoder) {
        super.init(coder: decoder)
    }
    
}
person Pawel    schedule 01.04.2021