如何在Swift中实现“分享按钮”

时间:2016-06-21 08:01:34

标签: ios swift social-networking

这是Twitter的一些代码和平......我想知道如何获得分享动作视图,就像我们在ios堆栈照片应用程序中获得...

@IBAction func twitterButton(sender: AnyObject) {

        let image: UIImage = UIImage(named: "LaunchScreenImage.png")!

        let twitterControl = SLComposeViewController(forServiceType: SLServiceTypeTwitter)
        twitterControl.setInitialText("")
        twitterControl.addImage(image)

        let completionHandler = {(result:SLComposeViewControllerResult) -> () in
            twitterControl.dismissViewControllerAnimated(true, completion: nil)
            switch(result){
            case SLComposeViewControllerResult.Cancelled:
                print("User canceled", terminator: "")
            case SLComposeViewControllerResult.Done:
                print("User tweeted", terminator: "")
            }
    }
        twitterControl.completionHandler = completionHandler
        self.presentViewController(twitterControl, animated: true, completion: nil)

}

9 个答案:

答案 0 :(得分:24)

   let firstActivityItem = "Text you want"
let secondActivityItem : NSURL = NSURL(string: "http//:urlyouwant")!
// If you want to put an image
let image : UIImage = UIImage(named: "image.jpg")!

let activityViewController : UIActivityViewController = UIActivityViewController(
    activityItems: [firstActivityItem, secondActivityItem, image], applicationActivities: nil)

// This lines is for the popover you need to show in iPad 
activityViewController.popoverPresentationController?.sourceView = (sender as! UIButton)

// This line remove the arrow of the popover to show in iPad
activityViewController.popoverPresentationController?.permittedArrowDirections = UIPopoverArrowDirection.allZeros
activityViewController.popoverPresentationController?.sourceRect = CGRect(x: 150, y: 150, width: 0, height: 0)

// Anything you want to exclude
activityViewController.excludedActivityTypes = [
    UIActivityTypePostToWeibo,
    UIActivityTypePrint,
    UIActivityTypeAssignToContact,
    UIActivityTypeSaveToCameraRoll,
    UIActivityTypeAddToReadingList,
    UIActivityTypePostToFlickr,
    UIActivityTypePostToVimeo,
    UIActivityTypePostToTencentWeibo
]

self.presentViewController(activityViewController, animated: true, completion: nil)

答案 1 :(得分:8)

  @IBAction func shareButtonClicked(sender: AnyObject)
    {
        //Set the default sharing message.
        let message = "Message goes here."
        //Set the link to share.
        if let link = NSURL(string: "http://yoururl.com")
        {
            let objectsToShare = [message,link]
            let activityVC = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil)
            activityVC.excludedActivityTypes = [UIActivityTypeAirDrop, UIActivityTypeAddToReadingList]
            self.presentViewController(activityVC, animated: true, completion: nil)
        }
    }

这将允许您呈现UIActivityViewController以与任何将接受它们的应用程序共享链接和消息。

答案 2 :(得分:8)

详细

  • Xcode 9.1,Swift 4
  • Xcode 10.2.1(10E1001),Swift 5

解决方案

  

TopViewController解决方案

extension UIApplication {
    class var topViewController: UIViewController? { return getTopViewController() }
    private class func getTopViewController(base: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? {
        if let nav = base as? UINavigationController { return getTopViewController(base: nav.visibleViewController) }
        if let tab = base as? UITabBarController {
            if let selected = tab.selectedViewController { return getTopViewController(base: selected) }
        }
        if let presented = base?.presentedViewController { return getTopViewController(base: presented) }
        return base
    }
}

extension Hashable {
    func share() {
        let activity = UIActivityViewController(activityItems: [self], applicationActivities: nil)
        UIApplication.topViewController?.present(activity, animated: true, completion: nil)
    }
}

用法

let str = "String"
str.share()

"Data to share".share()
1.share()

完整样本

  

不要忘记在此处添加解决方案代码(见上文)

import UIKit

class ViewController: UIViewController {

    private weak var imageView: UIImageView?
    override func viewDidLoad() {
        super.viewDidLoad()

        let button = UIButton(frame: CGRect(x: 50, y: 50, width: 100, height: 40))
        button.setTitle("Button", for: .normal)
        button.addTarget(self, action: #selector(shareButtonTapped), for: .touchUpInside)
        button.setTitleColor(.blue, for: .normal)
        view.addSubview(button)

        let imageView = UIImageView(frame: CGRect(x: 50, y: 120, width: 200, height: 200))
        imageView.image = UIImage(named: "image")
        imageView.isUserInteractionEnabled = true
        imageView.contentMode = .scaleAspectFill
        imageView.clipsToBounds = true
        imageView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(imageViewTapped)))
        view.addSubview(imageView)
        self.imageView = imageView
    }

    @objc func shareButtonTapped() { "Data to share".share() }
    @objc func imageViewTapped() { imageView?.image?.share() }
}

样本结果

enter image description here enter image description here

答案 3 :(得分:4)

我开发了@onemillion的回答:)你可以将它用于 Swift 3

override func viewDidLoad() {
    super.viewDidLoad()

    share(message: "selam", link: "htttp://google.com")
}

func share(message: String, link: String) {
    if let link = NSURL(string: link) {
        let objectsToShare = [message,link] as [Any]
        let activityVC = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil)
        self.present(activityVC, animated: true, completion: nil)
    }
}

答案 4 :(得分:2)

SWIFT 3.0更新

//首先将按钮添加到导航栏的功能

func addingNavBarBtn () {

    // setting button's image

    let comunicateImage = UIImage(named: "NavfShare")

    let comunicateBtn = UIBarButtonItem(image: comunicateImage, style: .plain, target: self, action: #selector(shareButtonPressed))

    comunicateBtn.tintColor = UIColor.white

    self.navigationItem.rightBarButtonItem = comunicateBtn

}

//setting button's action

func shareButtonPressed(){

    //checking the object and the link you want to share


    let urlString = "https://www.google.com"



    let linkToShare = [urlString!]

    let activityController = UIActivityViewController(activityItems: linkToShare, applicationActivities: nil)

    self.present(activityController, animated: true, completion: nil)

}

答案 5 :(得分:1)

let items = ["Your Sharing Content"];
let activity = UIActivityViewController(activityItems: items, applicationActivities: nil);
self.present(activity, animated: true, completion: nil)

答案 6 :(得分:0)

@IBAction func shareButtonAction(_ sender: AnyObject) {   

let activityVC = UIActivityViewController(activityItems: ["Whatever you    want to share"], applicationActivities: nil)
    activityVC.popoverPresentationController?.sourceView = self.view
    present(activityVC, animated: true, completion: nil)
    activityVC.completionWithItemsHandler = { (activityType, completed:Bool, returnedItems:[Any]?, error: Error?) in

        if completed  {
            self.dismiss(animated: true, completion: nil)
        }
    }
}

答案 7 :(得分:-1)

 @IBAction func action_shareOnSocial(_ sender: UIButton) {

    //  Converted to Swift 4 by Swiftify v4.1.6809 - https://objectivec2swift.com/
    let theMessage = "Text you want to set , https://www.hackingwithswift.com/"

    let items = [theMessage]

    // build an activity view controller
    let controller = UIActivityViewController(activityItems: items, applicationActivities: nil)

    let popPresenter: UIPopoverPresentationController? = controller.popoverPresentationController
    popPresenter?.sourceView = sender

    // and present it
    self.presentActivityController(controller)

}

func presentActivityController(_ controller: UIActivityViewController?) {
    // for iPad: make the presentation a Popover
    controller?.modalPresentationStyle = .popover

    if let aController = controller {
        present(aController, animated: true)
    }

    let popController: UIPopoverPresentationController? = controller?.popoverPresentationController

    popController?.permittedArrowDirections = .any

    popController?.barButtonItem = navigationItem.leftBarButtonItem

    // access the completion handler
    controller?.completionWithItemsHandler = { activityType, completed, returnedItems, error in
        // react to the completion
        if completed {

        } else {
            // user cancelled
            print("We didn't want to share anything after all.")
        }
    }
}

答案 8 :(得分:-1)

针对 public people3input$ = new Subject<string>(); public people3$ = this.people3input$ .pipe( debounceTime(200), distinctUntilChanged(), switchMap(term => this.api(term).pipe( catchError(() => of([])), // empty list on error )) ); JP Aquino的代码上进行改进,以改进导航控制器上的共享操作rightBarButtonItem。

在ViewController的 describe('people3$()', () => { it('should call api', () => { class MockApi { search(term) { console.log('I am never called') return of(['test123']) } } component.api = new MockApi().search; component.people3input$.next('ttt'); component.people3input$.subscribe(result => expect(result).toEqual(['test123'])) }); }); 中,执行以下操作:

Swift 5

然后在您的ViewController内部的某处实现viewDidLoad方法:

 navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(shareBarButtonItemClicked(_:)))

编码愉快!