如何在Mac应用程序中添加Share子菜单?例如Safari > File > Share。我查看了Apple SharingServices sample code,但它没有包含工作菜单项。

现在我有一个按钮,当点击时,它会显示可用的共享服务的选择器:
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的文件菜单下定义了一个Share子菜单项。
据我所知,NSSharingService列表是动态生成的。因此,我不能为我在Interface Builder中创建的菜单项预定义服务。
谢谢你的帮助。
发布于 2012-09-19 09:54:11
看看NSSharingService的+sharingServicesForItems:。在-validateMenuItem:方法中,您可以使用它返回的-title和-image创建子菜单。将每个服务与每个菜单项相关联,并将每个菜单项的操作指向以下位置:
- (IBAction)shareFromService:(id)sender {
[[sender representedObject] performWithItems: arrayOfItemsToShare];
}这真的很简单。苹果在这一点上做得很好。
发布于 2013-03-06 15:29:08
我发现gist可以帮助你轻松地创建一个适当服务的子菜单。https://gist.github.com/eternalstorms/4132533
这是一个NSSharingServicePicker类别。
发布于 2021-04-01 15:47:19
Swift版本:
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)
}
}https://stackoverflow.com/questions/12378595
复制相似问题