14

如何在 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 中创建的菜单项预定义服务。

谢谢你的帮助。

4

3 回答 3

16

查看 NSSharingService 的 +sharingServicesForItems:。在 -validateMenuItem: 方法中,您可以使用它返回的 NSSharingServices 的 -title 和 -image 创建子菜单。将每个服务与每个菜单项相关联,并将每个菜单项的操作指向此:

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

这真的很简单。苹果在这方面做得很好。

于 2012-09-19T01:54:10.950 回答
7

我发现要点可以帮助您轻松创建适当服务的子菜单。 https://gist.github.com/eternalstorms/4132533

这是一个 NSSharingServicePicker 类别。

于 2013-03-06T07:29:07.697 回答
2

斯威夫特版本:

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)
    }
    
}
于 2021-04-01T07:47:19.170 回答