覆盖 UIActivityViewController 默认行为

Posted

技术标签:

【中文标题】覆盖 UIActivityViewController 默认行为【英文标题】:Override UIActivityViewController default behaviour 【发布时间】:2012-10-07 14:05:45 【问题描述】:

在 iPhone 上的照片应用程序中,当您选择邮件共享选项时,照片会以动画方式进入向上滑动的模式视图控制器。如何修改内置 UIActivities 的行为?例如,我希望能够设置邮件撰写者的主题字段。

【问题讨论】:

【参考方案1】:

很遗憾,自定义 UIActivityViewController 邮件编辑器的主题字段尚未起作用。

有一个记录和报告的关于尝试自定义这里讨论的错误:

iphone - How do I set recipients for UIActivityViewController in ios 6?


如果这可行,根据文档,您将能够自定义这些邮件编写器字段:

UIActivityTypeMail: 该对象将提供的内容发布到新的电子邮件消息中。什么时候 使用这个服务,你可以提供 NSString 和 UIImage 对象和 指向本地文件的 NSURL 对象作为活动项目的数据。 您还可以指定内容使用 mailto 的 NSURL 对象 方案。

所以使用 mailto 方案,当它工作时,您应该能够像这样自定义这些字段:

    NSString *text = @"My mail text";
    NSURL *recipients = [NSURL URLWithString:@"mailto:foo@bar.com?subject=Here-is-a-Subject"];
    NSArray *activityItems = @[text, recipients];

    UIActivityViewController *activityController = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:nil];
    [self presentViewController:activityController animated:YES completion:nil];

如果您正在寻找自定义UIActivityViewController的其他方法,这里有一个很好的示例项目:

https://github.com/russj/ios6ShareDemo

【讨论】:

感谢您的链接。对于 Mail 或其他任何不符合您要求的行为,我相信可以创建一个自定义 UIActivitySource 来执行您想要的操作。在这种情况下,排除 UIActivityMail,并创建一个填充主题字段等的自定义活动。【参考方案2】:

我就是这样做的,它在 iOS 7 中对我有用。

创建一个符合 UIActivityItemSource 协议的类:

@interface CustomActivityItem : NSObject <UIActivityItemSource>
@end

在实现中重写相关方法:

- (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController

    return @"";


- (NSString *)activityViewController:(UIActivityViewController *)activityViewController subjectForActivityType:(NSString *)activityType

    if ([activityType isEqualToString:UIActivityTypeMail])
    
        return @"Subject"
    

    return nil;


- (id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(NSString *)activityType

    if ([activityType isEqualToString:UIActivityTypeMail])
    
        return @"body";
    

    return nil;

然后呈现活动视图控制器:

CustomActivityItem* activityItem = [[CustomActivityItem alloc] init];
UIActivityViewController* activityViewController = [[UIActivityViewController alloc] initWithActivityItems:@[activityItem]
                                                                                       applicationActivities:nil];

[self presentViewController:activityViewController animated:YES completion:nil];

【讨论】:

这种方法似乎不适用于 iOS9。您将收到错误“init”已在此处明确标记为不可用。 我在 iOS 9 中仍在使用这种方法,使用 Xcode 版本 7.0.1 (7A1001) 进行编译,并且效果很好。你得到的确切错误是什么? 这会添加收件人吗?

以上是关于覆盖 UIActivityViewController 默认行为的主要内容,如果未能解决你的问题,请参考以下文章

测试覆盖率

条件覆盖,路径覆盖,语句覆盖,分支覆盖

白盒测试法:逻辑覆盖与路径覆盖

代码覆盖率VS测试覆盖率

覆盖率啥意思

软件测试 白盒测试 语句覆盖 判定覆盖