覆盖 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 默认行为的主要内容,如果未能解决你的问题,请参考以下文章