我正在尝试在我的应用程序中添加一些基本的共享功能。
最初,我发现NSSharingServicePicker类已经实现了共享菜单,并且可以为共享服务指定委托。
该解决方案的问题在于我无法为不同的服务指定不同种类的项目。
例如:我想与电子邮件和Facebook共享一个“对象”。但是在Facebook上,我只想发布“ title”属性,而在电子邮件上,我想完全发布对象。

所以我想自己实现菜单并使用NSPopUpButton进行显示。现在,我有了所需的所有功能:因为可以在performWithItems:上调用NSSharingService,所以可以指定项目。
但是……当然有一个……共享菜单可以嵌入到不同的窗口中。并且在同一时间屏幕上可以有一个以上的窗口,因此我不知道如何处理NSSharingService类的委托。当前,每个窗口都有一个菜单对象,该对象创建和管理自己的服务数组。但是以这种方式,窗口的打开非常慢(从可用性的角度来看这是不可接受的)。我认为这是由于每次NSArray对象的NSSharingService创建。如果我切换到static数组,我将不知道如何处理委托。

有人对如何解决此问题有想法吗?

最佳答案

因此,最终,性能问题不是由NSSharingService菜单引起的。
不过,我完全重写了该组件。

我创建了一个单例类,该类负责发布“对象”。此外,它提供了一种创建菜单的方法(每次都有一个不同的菜单..)。

现在,每个窗口(控制器)都向组件询问菜单并显示菜单。当用户选择一个选项时,窗口(控制器)就是委托者,并且它知道正在显示哪个对象并且必须共享。因此,它要求共享组件与所选服务共享它。

唯一困难的部分是如何处理NSSharingService类的委托。与从委托方法传递的输入参数相比,我需要更多信息(仅当我调用performWithItems:时才知道此信息)。因此,我要做的是将要共享的项目数组保存为字典中的键(准确地说是NSCache,目前没有限制),以后再将需要的信息作为值保存。在委托方法(共享成功和失败)中,我检索信息并将对象从缓存中删除。
我不知道这是否是一个很好的解决方案。如果有人有其他想法,我欢迎您提出建议。

关于macos - NSSharingService根据所选服务自定义项目列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20901386/

10-12 13:59