为UIActivityViewController设置不同的活动项(Swift)

37

我有一个带有4个选项的UIActivityViewController信息/邮件/TW/FB。 我想为每个选项发送不同的活动!

例如: 在iMessage中,我需要放置:StringNSURLUIImage。 在邮件中,我需要将字符串放置在主题字段中,然后在正文中放置字符串、UIImageNSURL。 在TW/FB中,我想像社交帖子一样放置图像,还有一些字符串和NSURL

您是否知道这是否可能在iOS8上使用Swift实现?

我搜索了很多代码片段,但没有找到最适合我的。

3个回答

55
你应该利用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")
    }
}

上面的项目来源根据活动类型返回不同的字符串数据对象、主题和缩略图像。要使用它,您只需要将其传递到UIActivityViewController初始化程序中即可。

UIActivityViewController(activityItems: [MyStringItemSource()], applicationActivities: nil)

同样地,您可以定义一个自定义的 MyUrlItemSource 类,在初始化过程中根据所选活动返回不同的URL,并将其传递。

UIActivityViewController(activityItems: [MyStringItemSource(), MyUrlItemSource()], applicationActivities: nil)

所有这些内容都已经在官方文档中的 UIActivityViewControllerUIActivityItemSource 中详细说明。


@BhaveshNai:这里没有太多的Swift魔法。将上述内容翻译成Objective-C应该很简单。 - hennes
根本不需要写 delegate = self - Mohammad Zaid Pathan
你会如何完成最后一个任务,即“定义一个自定义的MyUrlItemSource类,根据所选活动返回不同的URL”? - user6631314
@user6631314:代码是一样的,只不过你返回一个URL而不是一个String - hennes

5

将与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")
  }

}

4

以下是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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接