Cocoa NSSharingService-删除facebook和twitter并添加打印
我刚刚实现了一个共享按钮,它有一个共享菜单:Cocoa NSSharingService-删除facebook和twitter并添加打印,cocoa,osx-mountain-lion,Cocoa,Osx Mountain Lion,我刚刚实现了一个共享按钮,它有一个共享菜单: [_shareButton sendActionOn:NSLeftMouseDownMask]; 这一行动是否与: -(IBAction)share:(id)sender { NSArray *shareArray = @[@"testShare"]; NSSharingServicePicker *sharingServicePicker = [[NSSharingServicePicker alloc] initWith
[_shareButton sendActionOn:NSLeftMouseDownMask];
这一行动是否与:
-(IBAction)share:(id)sender {
NSArray *shareArray = @[@"testShare"];
NSSharingServicePicker *sharingServicePicker = [[NSSharingServicePicker alloc] initWithItems:shareArray];
sharingServicePicker.delegate = self;
[sharingServicePicker showRelativeToRect:[sender bounds]
ofView:sender
preferredEdge:NSMinYEdge];
}
现在我的问题是,我不希望Facebook和Twitter成为菜单中的一个选项。我只希望电子邮件和消息可用。此外,我想添加“打印”,但不知道我是否可以这样做
可能吗
谢谢
(没有足够的代表点将“NSSharingService”添加为标记)通过使用
proposedSharingServices
解决了此问题
- (NSArray *)sharingServicePicker:(NSSharingServicePicker *)sharingServicePicker sharingServicesForItems:(NSArray *)items proposedSharingServices:(NSArray *)proposedServices{
// Find and the services you want
NSMutableArray *newProposedServices = [[NSMutableArray alloc] initWithCapacity:5];
for (NSSharingService *sharingService in proposedServices) {
if ([[sharingService title] isEqualToString:@"Email"] || [[sharingService title] isEqualToString:@"Message"]) {
[newProposedServices addObject:sharingService];
}
}
NSArray *services = newProposedServices;
NSSharingService *customService = [[NSSharingService alloc] initWithTitle:@"Print" image:[NSImage imageNamed:@"PrintImage"] alternateImage:nil handler:^{
// Do whatever
}];
services = [services arrayByAddingObject:customService];
return services;
}通过
提议的共享服务的一种稍有不同的方法
:
这里有一个更好的方法-不需要私有API访问
NSArray *excludedServices = @[NSSharingServiceNamePostOnFacebook,
NSSharingServiceNamePostOnTwitter];
NSMutableArray *includedServices = [[NSMutableArray alloc] init];
for (NSSharingService *service in proposedServices) {
if ([excludedServices indexOfObject:service] == NSNotFound) {
[includedServices addObject:service];
}
}
return includedServices;
将建议的服务与新的命名实例进行比较是可行的。以下是我的项目中的一个简单的Swift代码:
let excludedNames = [
NSSharingServiceNamePostOnFacebook,
NSSharingServiceNamePostOnTwitter,
]
var excludedServices = [NSSharingService]()
for name in excludedNames {
if let service = NSSharingService(named: name) {
excludedServices += [service]
}
}
return proposedServices.filter {
!excludedServices.contains($0)
}
无需使用私有的
名称
属性。而只需返回所需内容的列表即可尝试说出不需要的内容
- (NSArray<NSSharingService *> *)sharingServicePicker:(NSSharingServicePicker *)sharingServicePicker sharingServicesForItems:(NSArray *)items proposedSharingServices:(NSArray<NSSharingService *> *)proposedServices
{
NSArray *result = @[[NSSharingService sharingServiceNamed:NSSharingServiceNameComposeEmail], [NSSharingService sharingServiceNamed:NSSharingServiceNameComposeMessage]];
return result;
}
-(NSArray*)共享服务选取器:(NSSharingServicePicker*)共享服务选取器共享服务准则:(NSArray*)提议的项目共享服务:(NSArray*)提议的服务
{
NSArray*结果=@[[NSSharingService SharingServiceName:NSSharingServiceNameComposeMail],[NSSharingService SharingServiceName:NSSharingServiceNameComposeMessage];
返回结果;
}
需要注意的是,title属性是本地化的,因此如果应用程序不是以英语运行,“Email”和“Message”可能会有所不同。这是一个比查看title属性好得多的解决方案,因为title属性会根据语言发生变化,但不幸的是,name属性似乎是私有的。因此,尽管这项技术现在效果很好,但它可能会破坏OSX更新,并且可能无法通过AppStore审查。这没有任何作用。您正在查找NSSharingService
中的NSString
数组(即仅名称)中的匹配项。
- (NSArray<NSSharingService *> *)sharingServicePicker:(NSSharingServicePicker *)sharingServicePicker sharingServicesForItems:(NSArray *)items proposedSharingServices:(NSArray<NSSharingService *> *)proposedServices
{
NSArray *result = @[[NSSharingService sharingServiceNamed:NSSharingServiceNameComposeEmail], [NSSharingService sharingServiceNamed:NSSharingServiceNameComposeMessage]];
return result;
}