UIActivityItemSource Protocole 设置复杂对象

问题描述 投票:0回答:3

我正在使用 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
的方法!

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

此方法返回活动对象要操作的实际数据对象 苹果文档

有人曾经使用过这个

UIActivityItemSource
协议与数组吗,或者有没有完整的教程来做到这一点?

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

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

启动服务:无法找到应用程序标识符 com.apple.mobilemail

objective-c ios6 uiactivityviewcontroller
3个回答
23
投票

符合

UIactivityItemSource
的单个对象只能返回
activityViewControllerPlaceholderItem:
的单条数据,不能返回
NSArray

您可以通过在初始

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

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


16
投票

在花费了大量时间试图解决这个问题之后,似乎不可能向其传递

NSArray
的项目。所以我扩展了
UIActivityViewController
以使其成为可能。

RDActivityViewController


0
投票
  • (id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(NSString *)activityType 函数仅返回一个结果,不能返回 NSArray。如果您想退回多种类型的物品。您需要创建符合 UIActivityItemSource 协议的多个类。和第一个答案一样。另外,经过调试,我发现第二个答案中的RDActivityViewController存在内存泄漏问题
© www.soinside.com 2019 - 2024. All rights reserved.