我怎样才能在UIView类中调用presentViewController?

我的项目中有一个自定义选项卡,在应用程序的每个屏幕上,所以我制作了自定义的UIView类和xib文件,并在其中添加了button。 现在,我希望我的button在不同的屏幕上有不同的story board ID导航。 但我不能从UIView类调用presentViewController 。 以前我在extension类中自定义函数在屏幕之间导航,但UIView类也不能调用该函数。

 import UIKit @IBDesignable class tab: UIView { var view: UIView! @IBAction func btn1(sender: UIButton) { let storyboard = UIStoryboard(name: "Main", bundle: nil) let vc = storyboard.instantiateViewControllerWithIdentifier("6") self.presentViewController(vc, animated: true, completion: nil) } override init(frame: CGRect) { super.init(frame: frame) xibSetup() } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) xibSetup() } func xibSetup() { view = loadViewFromNib() view.frame = bounds view.autoresizingMask = [UIViewAutoresizing.FlexibleWidth, UIViewAutoresizing.FlexibleHeight] addSubview(view) } func loadViewFromNib() -> UIView { let bundle = NSBundle(forClass: self.dynamicType) let nib = UINib(nibName: "tab", bundle: bundle) let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView return view } } 

在你的button上调用这个函数

 func infoClick() { let storyboard: UIStoryboard = UIStoryboard (name: "Main", bundle: nil) let vc: CampainDetailView = storyboard.instantiateViewControllerWithIdentifier("campainDetailView") as! CampainDetailView let currentController = self.getCurrentViewController() currentController?.presentViewController(vc, animated: false, completion: nil) } 

这个函数将创build根视图控制器

 func getCurrentViewController() -> UIViewController? { if let rootController = UIApplication.sharedApplication().keyWindow?.rootViewController { var currentController: UIViewController! = rootController while( currentController.presentedViewController != nil ) { currentController = currentController.presentedViewController } return currentController } return nil } 

上面的代码必须工作,它在Swift 2.1中为我工作

你可以使用委托。 将此添加到Tab类

 protocol TabDelegate { func didButtonTapped() } var delegate: TabDelegate? @IBAction func btn1(sender: UIButton) { delegate?.didButtonTapped() } 

在使用Tab的viewController中。 像这样设置委托

 let tab = Tab() tab.delegate = self 

然后在委托方法中推新的viewController并且你可以让一个BaseViewController来做到这一点,那么所有的viewController子类就可以拥有相同的function。

 class BaseViewController: UIViewController, TabDelegate { func didButtonTapped() { let storyboard = UIStoryboard(name: "Main", bundle: nil) let vc = storyboard.instantiateViewControllerWithIdentifier("6") self.presentViewController(vc, animated: true, completion: nil) } } Class ViewControllerA: BaseViewController { } Class ViewControllerB: BaseViewController { } 

添加一个属性到这个类,然后你可以使用控制器的方法。

弱variables控制器:UIViewController!

self.controller?.presentViewController(vc,animated:true,completion:nil)