UIActivityItemSource Protocole 设置复杂对象

Posted

技术标签:

【中文标题】UIActivityItemSource Protocole 设置复杂对象【英文标题】:UIActivityItemSource Protocole set complex object 【发布时间】:2012-10-23 11:21:52 【问题描述】:

我正在使用 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";

当我为 activityViewController:itemForActivityType: 返回一个简单的 NSString 时,我的 UIActivityViewController 很好地使用了该字符串,但我找不到使用 Array 的方法!

根据 Apple 文档,这应该是可能的:

此方法返回活动对象要作用的实际数据对象 Apple documentation

有没有人用过这个UIActivityItemSource 协议和数组,或者有没有完整的教程可以做到这一点?

注意:我在控制台上也遇到了这个错误,它可能会有所帮助...

启动服务:注册未知应用标识符 com.apple.mobilemail 失败

启动服务:找不到应用标识符 com.apple.mobilemail

【问题讨论】:

你有没有发现控制台中关于 com.apple.mobilemail 的消息是什么? 控制台错误仅发生在模拟器中,其中邮件应用程序根本不存在。可以忽略。 @Tommecpe:你是怎么解决的? 【参考方案1】:

符合UIactivityItemSource的单个对象只能返回activityViewControllerPlaceholderItem:的单条数据,不能返回NSArrays。

您可以通过在初始initWithActivityItems:activityItems 部分中创建并传递两个UIActivityItemSources 来克服这个问题。每个源都可以传递一个占位符值,但可以在 itemForActivityType 上返回空白值,因此您实际上不必根据活动使用该特定类型的数据。

或者只是使用另一个答案中提到的那个很酷的扩展。

【讨论】:

我必须做到这一点,并在这里发布我的解决方案......也许它可以帮助某人:***.com/a/70866445/611879【参考方案2】:

在花费大量时间试图弄清楚这一点之后,似乎不可能将NSArray 的项目传递给它。所以我扩展了UIActivityViewController 使其成为可能。

RDActivityViewController

【讨论】:

非常感谢。我会尽快测试它。 有人能详细说明一下吗?什么方法不允许使用 NSArray?我有同样的问题,无法理解答案。 Tnx。 这太棒了!谢谢!为了这个问题,我已经把头撞在墙上几个小时了。 RDActivityViewController 效果很好。 @rdougan 我在我的 swift 项目中遇到了集成问题:'-[RDActivityViewController copyWithZone:]: unrecognized selector sent to instance 0x133220d60'

以上是关于UIActivityItemSource Protocole 设置复杂对象的主要内容,如果未能解决你的问题,请参考以下文章

UIActivityItemSource Protocole 设置复杂对象

UIActivityItemSource协议可选方法在iOS 8中不起作用

如何用 Protégé 中的其他标准本体扩展本体?

sh 再现Bray Nat Prot 2016

如何在 Protégé 中创建财产?

HQL 子选择错误