9

新しい UIActivityViewController を使用して、共有のためにすべての UIActionSheets を置き換えようとしましたが、問題が発生しました。

メッセージ、メール、コピー、Twitter、Facebook の 5 つのアクティビティがあります。カスタム UIActivityProvider サブクラスでこれを使用して、これらに異なるテキストを表示する方法をすでに理解しています。

- (id) activityViewController:(UIActivityViewController *)activityViewController
      itemForActivityType:(NSString *)activityType
{
    if ( [activityType isEqualToString:UIActivityTypePostToTwitter] )
        return twitter;
    if ( [activityType isEqualToString:UIActivityTypePostToFacebook] )
        return facebook;
    if ( [activityType isEqualToString:UIActivityTypeMessage] )
        return urlScheme;
    if ( [activityType isEqualToString:UIActivityTypeMail] )
        return urlScheme;
    if ( [activityType isEqualToString:UIActivityTypeCopyToPasteboard])
        return urlScheme;
    return nil;
}

そして、これは私のView Controllerで:

    ActivityProvider *aProvider = [[ActivityProvider alloc] init];
    aProvider.facebook = facebook;
    aProvider.twitter = twitter;
    aProvider.urlScheme = URL;

    NSArray *Items = @[aProvider, sharedURL];

    UIActivityViewController *activityVC = [[UIActivityViewController alloc]initWithActivityItems:Items applicationActivities:Nil];
    activityVC.excludedActivityTypes = @[UIActivityTypePrint, UIActivityTypeAssignToContact,UIActivityTypeSaveToCameraRoll, UIActivityTypePostToWeibo];


    [self presentViewController:activityVC animated:TRUE completion:nil];

ただし、メッセージ、電子メール、またはコピーではなく、Facebook と Twitter の共有シートに URL (sharedURL) のみを表示したいです。これを達成する方法はありますか?

4

2 に答える 2

15

アクティビティの種類ごとに何を送信するかを選択できます。カスタム アクティビティ プロバイダーを作成し、次のように呼び出します。

     NSMutableArray *activityItems = [NSMutableArray array];

     CustomActivityItemProvider *activityItemProvider =
     [[CustomActivityItemProvider alloc] initWithText:text
                                                     urlText:urlString];

     [activityItems addObject:activityItemProvider];


     //you can have your own custom activities too:
     NSArray *applicationActivities = @[[CustomActivity new],
                                              [OtherCustomActivity new]];
     UIActivityViewController *vc = [[UIActivityViewController alloc]initWithActivityItems:activityItems
                                                                     applicationActivities:applicationActivities];

カスタム プロバイダは UIActivityItemProvider のサブクラスです

@interface CustomActivityItemProvider : UIActivityItemProvider

- (id)initWithText:(NSString *)text urlText:(NSString *)url;

@end

私のカスタム プロバイダー クラスの内容は次のようになります。

- (id)initWithText:(NSString *)text urlText:(NSString *)url{

    if ((self = [super initWithPlaceholderItem:text])) {       
        self.text = text ?: @"";
        self.url = url ?: @"";
    }   
    return self;
}

- (id)item {   
    NSString *activityType = self.activityType;
    if ([self.placeholderItem isKindOfClass:[NSString class]]) {            
        if ([self.activityType isEqualToString:UIActivityTypePostToFacebook] ||
            [self.activityType isEqualToString:UIActivityTypeMail]) {

            return [NSString stringWithFormat:@"%@\n%@", self.text, self.url];

        } else if ([activityType isEqualToString:UIActivityTypePostToTwitter]) {

            return [self findBestStringOfLength:kTwitterMessageLength hashTags:YES];

        } else if ([activityType isEqualToString:UIActivityTypeMessage]) {

            return [self findBestStringOfLength:kSMSMessageLength hashTags:YES];

        } else {
            return self.text;
        }
    }

    return self.placeholderItem;
}
于 2013-04-14T03:30:38.097 に答える
0

これを行うには、独自の UIActivityItemProvider を実装し、そのデータを使用したくないアクティビティ タイプに対して nil を返す必要があります。

于 2013-05-16T14:35:21.993 に答える