UIActivityItemSource协议设置复杂对象

19
我正在使用iOS 6的新方式分享信息: UIActivityViewController。为了根据媒体(Facebook、Twitter或邮件)选择共享数据,我的视图控制器实现了以下UIActivityItemSource协议:
- (IBAction)onShareButton:(UIButton *)sender
{

    UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:@[self] applicationActivities:nil];

    activityViewController.excludedActivityTypes = @[UIActivityTypeMessage, UIActivityTypeAssignToContact, UIActivityTypeCopyToPasteboard, UIActivityTypeMessage, UIActivityTypePostToWeibo, UIActivityTypePrint, UIActivityTypeSaveToCameraRoll];
    [self presentViewController:activityViewController animated:YES completion:^{}];
}

#pragma mark - UIActivityItemSource Protocol

- (id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(NSString *)activityType {
    if ([activityType isEqualToString:UIActivityTypePostToFacebook]) {
        NSArray *items = @[@"message facebook", [NSURL URLWithString:@"http://www.myUrlFacebook.com"]];
        return items;
    } else if ([activityType isEqualToString:UIActivityTypePostToTwitter]) {
        NSArray *items = @[@"message twitter", [NSURL     URLWithString:@"http://www.myUrlTwitter.com"]];
        return items;
    } else if ([activityType isEqualToString:UIActivityTypeMail]) {
        NSArray *items = @[@"message mail", [NSURL URLWithString:@"http://www.myUrlMail.com"]];
        return items;
    }

        NSArray *items = @[@"Not a proper Activity", [NSURL URLWithString:@"http://www.myUrlMail.com"]];
    return items;
}

- (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController {
    return @"PlaceHolder";
}

当我使用简单的NSString返回activityViewController:itemForActivityType:时,我的UIActivityViewController可以很好地使用该字符串,但我找不到一种使用Array的方法!
根据苹果文档,这应该是可能的:
该方法返回要由活动对象处理的实际数据对象Apple documentation 是否有人曾经使用过数组来实现UIActivityItemSource协议,或者有没有有用的教程可以做到这一点?
注意:我还在控制台上得到了这个错误,它可能会有所帮助...
Launch Services:注册未知的应用程序标识符com.apple.mobilemail失败
Launch Services:无法找到应用程序标识符com.apple.mobilemail

2
你在控制台中找到关于com.apple.mobilemail的那条消息了吗? - Yarek T
1
控制台错误仅在模拟器中出现,因为邮件应用程序根本不存在。可以忽略它。 - Emil
@Tommecpe:你是怎么解决的? - BaSha
2个回答

23

实现 UIactivityItemSource 协议的单个对象只能返回一个数据片段,而不能返回NSArray

你可以通过在初始的initWithActivityItems:中创建和传递两个 UIActivityItemSource 对象来克服这一点。 每个源可以传递占位符值,但是在 itemForActivityType 上返回空白内容,因此根据活动类型,您实际上不必使用该特定类型的数据。

或者只需使用其他回答中提到的那个酷炫的扩展程序。


我必须准确地完成这个任务,并在此处发布了我的解决方案...也许它能帮助到某些人:https://dev59.com/zLDla4cB1Zd3GeqP5D2Q#70866445 - budiDino

16
经过相当长时间的尝试后,似乎不可能传递一个NSArray项目。所以我扩展了UIActivityViewController,使其成为可能。 RDActivityViewController

非常非常感谢。我会尽快测试它。 - Thomas Besnehard
有人能详细解释一下吗?是哪种方法不允许使用NSArray?我遇到了同样的问题,但无法理解答案。谢谢。 - jbbenni
1
太好了!谢谢你!我为这个问题已经苦思冥想了几个小时。RDActivityViewController非常好用。 - Dylan
@rdougan 我在我的 Swift 项目中遇到了集成问题:'-[RDActivityViewController copyWithZone:]:向实例 0x133220d60 发送未识别的选择器'。 - BaSha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接