2016-05-24 2 views
1

Поэтому я использую следующий код, чтобы получить текст для всех типов UIActivityTypes.UIActivityViewController обменивается имиджем только для FB, Twitter и Mail, но не для сообщений

 @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 "" 
    } 
} 

И здесь интересная часть происходит. Я добавляю изображение из URL-адреса в массив objectsToShare. Это будет нормально работать, если я хочу, чтобы изображение отображалось для всех, но моя проблема в том, что я не хочу показывать изображение для UIActivityTypeMessage. Это нужно просто содержать текст и изображение. Как я могу это сделать?

// Load image to share 
let articleURL = URLBuilder.sharedInstance.addOnlyHttps((promo?.imageUrl)!) 
KingfisherManager.sharedManager.cache.retrieveImageForKey(articleURL, options: nil) { (image, _) ->() in 
    if image != nil { 
     objectsToShare.append(image!) 
     self.openShareViewController(objectsToShare, sender: sender) 
    } else { 
     KingfisherManager.sharedManager.downloader.downloadImageWithURL(NSURL(string: articleURL)!, progressBlock: nil, completionHandler: { (image, error, imageURL, originalData) in 
      if image != nil { 
       KingfisherManager.sharedManager.cache.storeImage(image!, forKey: articleURL) 
       objectsToShare.append(image!) 
       self.openShareViewController(objectsToShare, sender: sender) 
      } 
     }) 

    } 
} 
+0

Мне нужно уточнение, вам нужно обмениваться имиджем и текстом через UIActivityViewcontroller. ** Исключение ** UIActivityTypeMessage должен иметь только текст не image.right? – Gokul

+0

@Gokulvivid пятно на хорошем сэре: D это действительно то, что мне нужно – SoundShock

+0

проверить мой ответ, он может заполнить вашу потребность. – Gokul

ответ

3
  1. Чтобы установить различное содержимое для разных ActivityItem лучший был заключается в использовании UIActivityItemSource .Для получения дополнительной информации о ActivityItemSource проверить это Documentation.
  2. Вы уже выполняете то же самое, так что легко решить проблему.
  3. Создать два класса UIActivityItemSource ниже

    SourceOne:

    class MyStringItemSourceOne: 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 
        } 
    } 
    
  4. Добавляя выше кода, мы устанавливаем Строка Content, что быть shared.Note в зависимости от активности activityType мы устанавливаем разные строковые значения.

  5. Наше требование установить изображение для всех activityType ожидать UIActivityTypeMessage, так что мы собираемся создать еще один UIActivityItemSource

    SourceTwo

    class MyStringItemSourceTwo: NSObject, UIActivityItemSource { 
    @objc func activityViewControllerPlaceholderItem(activityViewController: UIActivityViewController) -> AnyObject { 
        return "" 
        } 
    
    @objc func activityViewController(activityViewController: UIActivityViewController, itemForActivityType activityType: String) -> AnyObject? { 
    
        let Image: UIImage = UIImage(data: NSData(contentsOfURL: NSURL(string: "http://i.telegraph.co.uk/multimedia/archive/03589/Wellcome_Image_Awa_3589699k.jpg")!)!)! 
        if activityType == UIActivityTypeMessage { 
         return nil 
        } else if activityType == UIActivityTypeMail { 
        //return "String for mail" 
         return Image 
        } else if activityType == UIActivityTypePostToTwitter { 
         return Image 
        } else if activityType == UIActivityTypePostToFacebook { 
         return Image 
        } 
        return nil 
        } 
    
    } 
    
  6. Затем добавьте выше двух источник для UIActivityViewController как activityitems следующим образом:

    @IBAction func Test(sender: AnyObject) { 
    
        let activityVC = UIActivityViewController(activityItems: [MyStringItemSourceOne(),MyStringItemSourceTwo()] as [AnyObject], applicationActivities: nil) 
        //NOTE: Instead of using rootviewcontroller go with your own way. 
        if let window = (UIApplication.sharedApplication().delegate as? AppDelegate)?.window 
        { 
         window.rootViewController?.presentViewController(activityVC, animated: true, completion: nil) 
        } 
    } 
    
  7. Теперь все будет работать в соответствии с вашими требованиями.

Смежные вопросы