1

我使用UIActivityViewController共享文本和圖像。圖片來自activityImage,這是一個UIImage()。自定義文本從activityText()這是從UIActivityItemSource協議返回。使用'UIActivityItemSource`協議無法與Instagram共享

問題在於,Instagram在某些條件下僅在UIActivityViewController中可見。

要summerize下面的測試:

  • Instagram的是僅可見UIActivityViewControlleractivityItems: [activityImage]activityItems: [activityImage, NSNull()]

  • Instagram的被隱藏activityItems: [activityImage, activityText()]即使當返回UIActivityItemSource協議值是""nilNSNull()

的問題是,UIActivityItemSource協議需要被調用,使不同的共享平臺,可以單獨管理。


問題:

  • 我怎樣才能調用UIActivityItemSource協議時分享的Instagram?

  • 什麼替代""nilNSNull()調用UIActivityItemSource協議時,我可以試試嗎?


代碼:

class activityText: NSObject, UIActivityItemSource { 
    @objc func activityViewControllerPlaceholderItem(activityViewController: UIActivityViewController) -> AnyObject { 
     return "" 
    } 
    @objc func activityViewController(activityViewController: UIActivityViewController, itemForActivityType activityType: String) -> AnyObject? { 
     switch activityType { 
     case UIActivityTypeMessage: 
      return "Special text when sharing to Messages." 
     default: 
      return "" 
     } 
    } 
} 

func shareEverwhere() { 
     var activityImage: UIImage() 
     let activity = UIActivityViewController(activityItems: [activityImage, activityText()], applicationActivities: nil) 
     self.presentViewController(activity, animated: true, completion: nil) 
} 

測試:

Instagram的是可見UIActivityViewController

let activity = UIActivityViewController(activityItems: [activityImage], applicationActivities: nil) 

let activity = UIActivityViewController(activityItems: [activityImage, NSNull()], applicationActivities: nil) 

Instagram的被隱藏UIActivityViewController

let activity = UIActivityViewController(activityItems: [activityImage, ""], applicationActivities: nil) 

let activity = UIActivityViewController(activityItems: [activityImage, activityText()], applicationActivities: nil) 

let activity = UIActivityViewController(activityItems: [activityImage, activityText()], applicationActivities: nil) 
class activityText: NSObject, UIActivityItemSource { 
    @objc func activityViewControllerPlaceholderItem(activityViewController: UIActivityViewController) -> AnyObject { 
     return "" 
    } 
    @objc func activityViewController(activityViewController: UIActivityViewController, itemForActivityType activityType: String) -> AnyObject? { 
     return NSNull() 
    } 
} 

let activity = UIActivityViewController(activityItems: [activityImage, activityText()], applicationActivities: nil) 
class activityText: NSObject, UIActivityItemSource { 
    @objc func activityViewControllerPlaceholderItem(activityViewController: UIActivityViewController) -> AnyObject { 
     return "" 
    } 
    @objc func activityViewController(activityViewController: UIActivityViewController, itemForActivityType activityType: String) -> AnyObject? { 
      return nil 
    } 
} 

let activity = UIActivityViewController(activityItems: [activityImage, activityText()], applicationActivities: nil) 
class activityText: NSObject, UIActivityItemSource { 
    @objc func activityViewControllerPlaceholderItem(activityViewController: UIActivityViewController) -> AnyObject { 
     return "" 
    } 
    @objc func activityViewController(activityViewController: UIActivityViewController, itemForActivityType activityType: String) -> AnyObject? { 
      return "" 
    } 
} 

回答

2

有人問,在回答:Share image with hashtag via UIActivityViewController (Twitter, Facebook, Instagram)

 UIActivityViewController *activityViewController = 
[[UIActivityViewController alloc] initWithActivityItems:@[vm.image, [[ActivityStringItemSource alloc] initWithString:attributedString]] applicationActivities:nil]; 

和類實現字符串(或沒有)的回報是:

@interface ActivityStringItemSource()<UIActivityItemSource> 

@property(strong, nonatomic) NSMutableAttributedString *stringContent; 
@end 

@implementation ActivityStringItemSource 

- (instancetype)initWithString:(NSMutableAttributedString *) placeholder 
{ 
    self = [super init]; 
    if (self) { 
     _stringContent = placeholder; 
    } 
    return self; 
} 

- (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController { 
    return [NSObject new]; 
} 

- (id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(UIActivityType)activityType { 
    if([activityType containsString:@"instagram"]) { 
     return nil; 
    } else { 
     return _stringContent; 
    } 
} 

@end 

的關鍵,如通過指向原來答案是返回一個NSObject(該類擴展NSObject的)。然後在項目選擇中,只需測試instagram返回零,否則返回您的字符串。

+0

謝謝@Olivier品牌,我會檢查一下,並給它一個去。 – user4806509

+0

你能解釋一下嗎?! –