NSSharingService Sharing Подменю

Как добавить подменю "Поделиться" в приложении 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 генерируется на лету. Поэтому я не могу предопределить службы для пункта меню, который я создал в Интерфейсном Разработчике.

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

3 ответа

Решение

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

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

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

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

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

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

      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)
    }
    
}
Другие вопросы по тегам