从UIView调用共享表

时间:2016-09-02 03:54:37

标签: ios swift 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上打电子表。

感谢。

2 个答案:

答案 0 :(得分:0)

这正如预期的那样工作.UIViews不应该提出观点。他们应该向代表们报告,以便处理这个问题。

对于SideMenu,你的UIView,你需要一个代表来处理它正在做的事情......例如设置视图控制器,将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()

答案 1 :(得分:0)

这是我对Swift 4中上述问题的解决方案 - 我希望它有所帮助。

首先我创建了一个.swift文件:day.Contains(DayOfWeek.Sunday); //.. ,它有这个协议:

SideMenuShareDelegate

然后,我在protocol SideMenuShareDelegate { func initiateShare() } UIView类中实现了上面的这个协议,如下所示:

SideMenu

这基本上是说, import UIKit class SideMenu: UIView { var sideShareDelegate: SideMenuShareDelegate? @IBAction func shareAppBtn(_ sender: Any) { sideShareDelegate.initiateShare() } } 中有一个称为initiateShare()的功能(您将在下面看到),只要用户点击SideMenuViewController,就会调用此功能。< / p>

现在,在shareAppBtn内,我将实现协议,并以此方式在SideMenuViewController内添加UIActivityViewController功能:

initiateShare()

这应该使activityView完美运行!这对我有用,希望它也适合你:)