Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UIActivityViewController-仅为某些活动附加URL_Ios_Objective C_Xcode_Url_Uiactivityviewcontroller - Fatal编程技术网

Ios UIActivityViewController-仅为某些活动附加URL

Ios UIActivityViewController-仅为某些活动附加URL,ios,objective-c,xcode,url,uiactivityviewcontroller,Ios,Objective C,Xcode,Url,Uiactivityviewcontroller,我一直在尝试使用新的UIActivityViewController替换所有用于共享的UIActionSheet,但遇到了一个问题 我有5个活动,消息、电子邮件、复制、推特和Facebook。我已经在自定义UIActivityProvider子类中找到了如何让它们显示不同的文本: - (id) activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(N

我一直在尝试使用新的UIActivityViewController替换所有用于共享的UIActionSheet,但遇到了一个问题

我有5个活动,消息、电子邮件、复制、推特和Facebook。我已经在自定义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;
}
在我的视图控制器中:

    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),而不是消息、电子邮件或副本。有什么方法可以做到这一点吗?

您可以选择向每种类型的活动发送什么。我创建了一个自定义活动提供程序,并将其命名为:

     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];
- (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;
}
自定义提供程序是UIActivityItemProvider的子类

@interface CustomActivityItemProvider : UIActivityItemProvider

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

@end
我的自定义提供程序类的核心如下所示:

     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];
- (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;
}

您应该能够通过实现自己的UIActivityItemProvider来实现这一点,并且对于您不想使用该数据的任何活动类型都返回nil