为 UIActivityViewController Swift 设置不同的 activity 项
Set different activity items for UIActivityViewController Swift
我 UIActivityViewController
有 4 个选项:消息/邮件/TW/FB。
我想为每个选项发送不同的活动!
例如:
在 iMessage
sheet 中,我需要输入:String
、NSURL
和 UIImage
。
在邮件中,我需要在主题字段中放置字符串,然后在正文中放置字符串,还需要 UIImage
和 NSURL
。
在 TW/FB
中,我想像社交 post 那样放置图像,还有一些字符串和 NSURL
。
你知道这在 iOS8 和 Swift 中是否可行吗?
我搜索了很多代码,没有找到最适合我的。
您应该利用 UIActivityItemSource
协议。 UIActivityViewController
初始化程序的 activityItems
参数接受数据对象数组或实现 UIActivityItemSource
协议的对象数组。
举个例子,考虑如下的项目来源。
class MyStringItemSource: NSObject, UIActivityItemSource {
@objc func activityViewControllerPlaceholderItem(activityViewController: UIActivityViewController) -> AnyObject {
return ""
}
@objc func activityViewController(activityViewController: UIActivityViewController, itemForActivityType activityType: String) -> AnyObject? {
if activityType == UIActivityTypeMessage {
return "String for message"
} else if activityType == UIActivityTypeMail {
return "String for mail"
} else if activityType == UIActivityTypePostToTwitter {
return "String for twitter"
} else if activityType == UIActivityTypePostToFacebook {
return "String for facebook"
}
return nil
}
func activityViewController(activityViewController: UIActivityViewController, subjectForActivityType activityType: String?) -> String {
if activityType == UIActivityTypeMessage {
return "Subject for message"
} else if activityType == UIActivityTypeMail {
return "Subject for mail"
} else if activityType == UIActivityTypePostToTwitter {
return "Subject for twitter"
} else if activityType == UIActivityTypePostToFacebook {
return "Subject for facebook"
}
return ""
}
func activityViewController(activityViewController: UIActivityViewController, thumbnailImageForActivityType activityType: String!, suggestedSize size: CGSize) -> UIImage! {
if activityType == UIActivityTypeMessage {
return UIImage(named: "thumbnail-for-message")
} else if activityType == UIActivityTypeMail {
return UIImage(named: "thumbnail-for-mail")
} else if activityType == UIActivityTypePostToTwitter {
return UIImage(named: "thumbnail-for-twitter")
} else if activityType == UIActivityTypePostToFacebook {
return UIImage(named: "thumbnail-for-facebook")
}
return UIImage(named: "some-default-thumbnail")
}
}
以上项目来源 returns 基于 activity 类型的不同字符串数据对象、主题和缩略图。要使用,您只需将其传递给 UIActivityViewController
初始化程序。
UIActivityViewController(activityItems: [MyStringItemSource()], applicationActivities: nil)
同样,您可以定义一个自定义 MyUrlItemSource
class,根据所选 activity returns 不同的 URL,并将其传递到初始化程序中。
UIActivityViewController(activityItems: [MyStringItemSource(), MyUrlItemSource()], applicationActivities: nil)
所有这些都在 UIActivityViewController
and UIActivityItemSource
的官方文档中进行了概述
从 hennes 翻译成 swift 3
的相同解决方案
class MyStringItemSource: NSObject, UIActivityItemSource {
public func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any {
return ""
}
public func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivityType) -> Any? {
if activityType == UIActivityType.message {
return "String for message"
} else if activityType == UIActivityType.mail {
return "String for mail"
} else if activityType == UIActivityType.postToTwitter {
return "String for twitter"
} else if activityType == UIActivityType.postToFacebook {
return "String for facebook"
}
return nil
}
public func activityViewController(_ activityViewController: UIActivityViewController, subjectForActivityType activityType: UIActivityType?) -> String {
if activityType == UIActivityType.message {
return "Subject for message"
} else if activityType == UIActivityType.mail {
return "Subject for mail"
} else if activityType == UIActivityType.postToTwitter {
return "Subject for twitter"
} else if activityType == UIActivityType.postToFacebook {
return "Subject for facebook"
}
return ""
}
public func activityViewController(_ activityViewController: UIActivityViewController, thumbnailImageForActivityType activityType: UIActivityType?, suggestedSize size: CGSize) -> UIImage? {
if activityType == UIActivityType.message {
return UIImage(named: "thumbnail-for-message")
} else if activityType == UIActivityType.mail {
return UIImage(named: "thumbnail-for-mail")
} else if activityType == UIActivityType.postToTwitter {
return UIImage(named: "thumbnail-for-twitter")
} else if activityType == UIActivityType.postToFacebook {
return UIImage(named: "thumbnail-for-facebook")
}
return UIImage(named: "some-default-thumbnail")
}
}
Objective-C 相当于 hennes 答案:
@interface MyStringItemSource : NSObject <UIActivityItemSource>
{
}
@end
@implementation MyStringItemSource
-(id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController
{
return @"";
}
-(id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(UIActivityType)activityType
{
if (activityType == UIActivityTypeMessage) {
return @"String for message";
} else if (activityType == UIActivityTypeMail) {
return @"String for mail";
}
return nil;
}
-(NSString *)activityViewController:(UIActivityViewController *)activityViewController subjectForActivityType:(UIActivityType)activityType
{
if (activityType == UIActivityTypeMessage) {
return @"Subject for message";
} else if (activityType == UIActivityTypeMail) {
return @"Subject for mail";
}
return @"";
}
-(UIImage *)activityViewController:(UIActivityViewController *)activityViewController thumbnailImageForActivityType:(UIActivityType)activityType suggestedSize:(CGSize)size
{
if (activityType == UIActivityTypeMessage) {
return [UIImage imageNamed: @"thumbnail-for-message"];
} else if (activityType == UIActivityTypeMail) {
return [UIImage imageNamed: @"thumbnail-for-mail"];
}
return [UIImage imageNamed: @"thumbnail-for-default"];
}
@end
我 UIActivityViewController
有 4 个选项:消息/邮件/TW/FB。
我想为每个选项发送不同的活动!
例如:
在 iMessage
sheet 中,我需要输入:String
、NSURL
和 UIImage
。
在邮件中,我需要在主题字段中放置字符串,然后在正文中放置字符串,还需要 UIImage
和 NSURL
。
在 TW/FB
中,我想像社交 post 那样放置图像,还有一些字符串和 NSURL
。
你知道这在 iOS8 和 Swift 中是否可行吗?
我搜索了很多代码,没有找到最适合我的。
您应该利用 UIActivityItemSource
协议。 UIActivityViewController
初始化程序的 activityItems
参数接受数据对象数组或实现 UIActivityItemSource
协议的对象数组。
举个例子,考虑如下的项目来源。
class MyStringItemSource: NSObject, UIActivityItemSource {
@objc func activityViewControllerPlaceholderItem(activityViewController: UIActivityViewController) -> AnyObject {
return ""
}
@objc func activityViewController(activityViewController: UIActivityViewController, itemForActivityType activityType: String) -> AnyObject? {
if activityType == UIActivityTypeMessage {
return "String for message"
} else if activityType == UIActivityTypeMail {
return "String for mail"
} else if activityType == UIActivityTypePostToTwitter {
return "String for twitter"
} else if activityType == UIActivityTypePostToFacebook {
return "String for facebook"
}
return nil
}
func activityViewController(activityViewController: UIActivityViewController, subjectForActivityType activityType: String?) -> String {
if activityType == UIActivityTypeMessage {
return "Subject for message"
} else if activityType == UIActivityTypeMail {
return "Subject for mail"
} else if activityType == UIActivityTypePostToTwitter {
return "Subject for twitter"
} else if activityType == UIActivityTypePostToFacebook {
return "Subject for facebook"
}
return ""
}
func activityViewController(activityViewController: UIActivityViewController, thumbnailImageForActivityType activityType: String!, suggestedSize size: CGSize) -> UIImage! {
if activityType == UIActivityTypeMessage {
return UIImage(named: "thumbnail-for-message")
} else if activityType == UIActivityTypeMail {
return UIImage(named: "thumbnail-for-mail")
} else if activityType == UIActivityTypePostToTwitter {
return UIImage(named: "thumbnail-for-twitter")
} else if activityType == UIActivityTypePostToFacebook {
return UIImage(named: "thumbnail-for-facebook")
}
return UIImage(named: "some-default-thumbnail")
}
}
以上项目来源 returns 基于 activity 类型的不同字符串数据对象、主题和缩略图。要使用,您只需将其传递给 UIActivityViewController
初始化程序。
UIActivityViewController(activityItems: [MyStringItemSource()], applicationActivities: nil)
同样,您可以定义一个自定义 MyUrlItemSource
class,根据所选 activity returns 不同的 URL,并将其传递到初始化程序中。
UIActivityViewController(activityItems: [MyStringItemSource(), MyUrlItemSource()], applicationActivities: nil)
所有这些都在 UIActivityViewController
and UIActivityItemSource
从 hennes 翻译成 swift 3
的相同解决方案class MyStringItemSource: NSObject, UIActivityItemSource {
public func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any {
return ""
}
public func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivityType) -> Any? {
if activityType == UIActivityType.message {
return "String for message"
} else if activityType == UIActivityType.mail {
return "String for mail"
} else if activityType == UIActivityType.postToTwitter {
return "String for twitter"
} else if activityType == UIActivityType.postToFacebook {
return "String for facebook"
}
return nil
}
public func activityViewController(_ activityViewController: UIActivityViewController, subjectForActivityType activityType: UIActivityType?) -> String {
if activityType == UIActivityType.message {
return "Subject for message"
} else if activityType == UIActivityType.mail {
return "Subject for mail"
} else if activityType == UIActivityType.postToTwitter {
return "Subject for twitter"
} else if activityType == UIActivityType.postToFacebook {
return "Subject for facebook"
}
return ""
}
public func activityViewController(_ activityViewController: UIActivityViewController, thumbnailImageForActivityType activityType: UIActivityType?, suggestedSize size: CGSize) -> UIImage? {
if activityType == UIActivityType.message {
return UIImage(named: "thumbnail-for-message")
} else if activityType == UIActivityType.mail {
return UIImage(named: "thumbnail-for-mail")
} else if activityType == UIActivityType.postToTwitter {
return UIImage(named: "thumbnail-for-twitter")
} else if activityType == UIActivityType.postToFacebook {
return UIImage(named: "thumbnail-for-facebook")
}
return UIImage(named: "some-default-thumbnail")
}
}
Objective-C 相当于 hennes 答案:
@interface MyStringItemSource : NSObject <UIActivityItemSource>
{
}
@end
@implementation MyStringItemSource
-(id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController
{
return @"";
}
-(id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(UIActivityType)activityType
{
if (activityType == UIActivityTypeMessage) {
return @"String for message";
} else if (activityType == UIActivityTypeMail) {
return @"String for mail";
}
return nil;
}
-(NSString *)activityViewController:(UIActivityViewController *)activityViewController subjectForActivityType:(UIActivityType)activityType
{
if (activityType == UIActivityTypeMessage) {
return @"Subject for message";
} else if (activityType == UIActivityTypeMail) {
return @"Subject for mail";
}
return @"";
}
-(UIImage *)activityViewController:(UIActivityViewController *)activityViewController thumbnailImageForActivityType:(UIActivityType)activityType suggestedSize:(CGSize)size
{
if (activityType == UIActivityTypeMessage) {
return [UIImage imageNamed: @"thumbnail-for-message"];
} else if (activityType == UIActivityTypeMail) {
return [UIImage imageNamed: @"thumbnail-for-mail"];
}
return [UIImage imageNamed: @"thumbnail-for-default"];
}
@end