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