NSSharingService - 删除Facebook和Twitter并添加打印

时间:2013-04-17 18:46:13

标签: cocoa osx-mountain-lion

我刚刚实现了一个共享按钮,它有一个共享菜单:

 [_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'作为标签)

5 个答案:

答案 0 :(得分:1)

使用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;

}

答案 1 :(得分:1)

将建议的服务与新的命名实例进行比较。这是我项目中的一个简单的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)
}

无需使用私有name属性。

答案 2 :(得分:1)

而不是试图说出你不想要的东西,只需返回你想要的清单。

- (NSArray<NSSharingService *> *)sharingServicePicker:(NSSharingServicePicker *)sharingServicePicker sharingServicesForItems:(NSArray *)items proposedSharingServices:(NSArray<NSSharingService *> *)proposedServices
{
    NSArray *result = @[[NSSharingService sharingServiceNamed:NSSharingServiceNameComposeEmail], [NSSharingService sharingServiceNamed:NSSharingServiceNameComposeMessage]];
    return result;
}

答案 3 :(得分:0)

通过proposedSharingServices稍微不同的方法:

- (NSArray*)sharingServicePicker:(NSSharingServicePicker *)sharingServicePicker sharingServicesForItems:(NSArray *)items proposedSharingServices:(NSArray *)proposedServices {

    NSArray *excludedServices = @[NSSharingServiceNamePostOnFacebook,
                                  NSSharingServiceNamePostOnTwitter];

    NSArray *sharingServices = [proposedServices filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"NOT (name IN %@)", excludedServices]];

    return sharingServices;
}

答案 4 :(得分:0)

这是一种更好的方法 - 无需私有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;