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)
}
}