正在从UIView调用共享工作表



我正试图解决我所面临的问题。我想按下一个按钮并通过共享表共享URL。以下是我目前所拥有的:

import UIKit
class SideMenu: UIView {
    //share app 
    @IBAction func shareAppBtn(sender: AnyObject ) {
        print("shareAppBtn tapped")
        let myWebsite = NSURL(string:"http://www.google.com/")
        guard let url = myWebsite else {
            print("nothing found")
            return
        }      
        let shareItems:Array = [url]
        let activityViewController:UIActivityViewController = UIActivityViewController(activityItems: shareItems, applicationActivities: nil)
        self.presentViewController(activityViewController, animated: true, completion: nil) 
    }
}

这给了我以下错误:Value of type 'SideMenu' has no member 'presentViewController'。我认为以上内容不起作用,因为presentViewController是UIViewcontroller的一个组件,我从UIView调用它。

因此,我尝试了以下操作,试图调用UIViewcontroller:

import UIKit
class SideMenu: UIView {
//share app 
@IBAction func shareAppBtn(sender: AnyObject, viewController : UIViewController) -> Void
{
    print("shareAppBtn tapped")
    let myWebsite = NSURL(string:"http://www.google.com/")
    guard let url = myWebsite else {
        print("nothing found")
        return
    }
    let shareItems:Array = [url]
    let activityViewController:UIActivityViewController = UIActivityViewController(activityItems: shareItems, applicationActivities: nil)
    viewController.presentViewController(activityViewController, animated: true, completion: nil) 
    }
}

但上面给了我以下错误:unrecognized selector sent to instance 0x7fe93acb6720'

所以我终于尝试了:

import UIKit
class SideMenu: UIView {
//share app 
@IBAction func shareAppBtn(sender: AnyObject) {
    print("shareAppBtn tapped")
    let myWebsite = NSURL(string:"http://www.google.com/")
    guard let url = myWebsite else {
        print("nothing found")
        return
    }
    let shareItems:Array = [url]
    let activityViewController:UIActivityViewController = UIActivityViewController(activityItems: shareItems, applicationActivities: nil)
    self.window?.rootViewController?.presentViewController(activityViewController, animated: true, completion: nil)
    }
}

但上面给了我以下错误:

Warning: Attempt to present <UIActivityViewController: 0x7fe03e04c600>  on <RAMAnimatedTabBarController.RAMAnimatedTabBarController: 0x7fe03bc4a170> which is already presenting <SideMenu.UISideMenuNavigationController: 0x7fe03c094200>

我在这里错过了什么?我想调用UIView上的共享工作表。

谢谢。

这正在按预期工作。。UIViews不应该呈现视图。他们应该向负责处理此事的代表报告。

在您的UIView SideMenu的情况下,您需要一个委托来处理它正在做的事情。。。例如,将显示SideMenu的视图控制器设置为代理。。

因此,使用我快速生成的一些示例代码。。

protocol SideMenuDelegate {
    func sideMenuDidShare()
}

委托协议是处理SideMenu视图的视图控制器将实现的协议。

class SideMenu: UIView {
    var delegate: SideMenuDelegate?
}

在SideMenu视图类中,您需要添加一个委托属性。

class SideMenuViewController: UIViewController, SideMenuDelegate {
    func sideMenuDidShare() {
        print("this is where your share code goes and where you can present other viewControllers from")
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        let sideMenu = self.view as? SideMenu
        sideMenu?.delegate = self
    }
}

在处理SideMenu的视图控制器中,您可以实现SideMenuDelegate协议,例如class SideMenuViewController: UIViewController, SideMenuDelegate

这样做可以让SideMenu在发生什么事情时告诉它的委托(ViewController(,在本例中是实现的func sideMenuDidShare()

以下是我在Swift 4中对上述问题的解决方案,我希望它能有所帮助。

首先,我创建了一个.swift文件:SideMenuShareDelegate,其中包含以下协议:

protocol SideMenuShareDelegate {
    func initiateShare()
}

然后,我在SideMenuUIView类中实现了上面的这个协议,如下所示:

    import UIKit
    class SideMenu: UIView { 
    var sideShareDelegate: SideMenuShareDelegate?
    @IBAction func shareAppBtn(_ sender: Any) {
      sideShareDelegate.initiateShare()
    }
}

这基本上是说,在SideMenuViewController中有一个称为initiateShare()的函数(您将在下面看到(,每当用户单击shareAppBtn时都会调用它。

现在,在SideMenuViewController中,我将实现该协议,并以这种方式在initiateShare()中添加UIActivityViewController功能:

import UIKit 
class SideMenuViewController: UIViewController, SideMenuShareDelegate {
  override func viewDidLoad() {
     super.viewDidLoad()
     SideMenuView?.sideShareDelegate = self
   }
  func initiateShare(){
   //UIActivityViewController functionality goes here
     let t = "www.my-website.com"
     let textToShare = [t]
     let activityVC = UIActivityViewController(activityItems: textToShare, applicationActivities: nil)
     activityVC.popoverPresentationController?.sourceView = self.view 
     self.present(activityVC, animated:true, completion:nil)
  }
}

这应该会使activityView完美工作!这对我有效,希望对你也有效:(

最新更新