UIActivityViewController
を1つの長いNSString
とともにデータとして使用しようとしています。 140文字を超える文字列を入力すると、その中のツイートシートに文字列が表示されません。また、コントローラーに渡す前に文字列を切り捨てると、すべてのUIActivities
に切り捨てられた文字列が含まれます。 Facebookやメッセージを切り捨てたくありません。
異なるUIActivities
に異なる文字列を与える方法はありますか?
ありがとうございました!
(例:MarcoArmentのTheMagazineアプリは、切り捨てられた文字列の後にUIActivityPostToTwitter
に@TheMagazineAppを、その他のUIActivities
に他のものを含めることでこれを行います。)
これがあなたが探しているものだと思います: カスタムUIActivityViewControllerアイコンとテキスト 。
アクティビティタイプごとに異なるデータを提供できるはずです。
これが誰かに役立つことを願っています。 UIActivityItemProvider
をサブクラス化すると、非常に簡単です。
@interface MyActivityItemProvider : UIActivityItemProvider
@end
@implementation MyActivityItemProvider
- (id)item
{
// Return nil, if you don't want this provider to apply
// to a particular activity type (say, if you provide
// print data as a separate item for UIActivityViewController).
if ([self.activityType isEqualToString:UIActivityTypePrint])
return nil;
// The data you passed while initialising your provider
// is in placeholderItem now.
if ([self.activityType isEqualToString:UIActivityTypeMail] ||
[self.activityType isEqualToString:UIActivityTypeCopyToPasteboard])
{
return self.placeholderItem;
}
// Return something else for other activities. Obviously,
// you can as well reuse the data in placeholderItem here.
return @"Something else";
}
@end
次に、アクティビティアイテムの配列を含むインスタンスをUIActivityViewControllerに渡します。
MyActivityItemProvider *activityItem =
[[MyActivityItemProvider alloc] initWithPlaceholderItem:@"Your data"];
NSArray *sharingItems = [NSArray arrayWithObjects:
activityItem, _myUITextView.viewPrintFormatter, nil];
UIActivityViewController *activityController =
[[UIActivityViewController alloc]
initWithActivityItems:sharingItems applicationActivities:nil];
これは、 activityType
オブジェクトのオプションのUIActivityItemProvider
プロパティを使用して簡単に実行できます。そのプロパティはUIActivityType
を返すので、次のようなことができます。
class PhotoActivityItemProvider: UIActivityItemProvider {
...
override var item: Any {
guard let activityType = self.activityType else {
return photoURL.absoluteString
}
if activityType == .mail || activityType == .message {
return "The photo link is \(photoURL.absoluteString)."
}
...
}
私のブログ投稿の詳細情報: https://www.whitesmith.co/blog/control-what-youre-sharing/
@ Mu-Sonicが提案したように、UIActivityItemSource
に準拠するクラスを作成し、そのインスタンスをアクティビティ項目の配列とともにUIActivityViewController:に渡すことができます。
どのプラットフォームでユーザーが共有しているかを知り、タップされたプラットフォームに依存する特定のデータを返す場合は、public func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any?
をオーバーライドします。