There is a custom tab in in my project that is on every screen of the app, so i made custom UIView
class and xib
file and added buttons in them. Now i want my buttons for navigations on different screens having different story board
ids. But i can't call presentViewController
from UIView
class. Previously i custom function in extension
class to navigate between screens but UIView
class also can't call that function.
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
}
}
Call this function on your 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)
}
This function will create root view controller
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
}
This above code must work, it is working for me in Swift 2.1
You can use delegate. Add this to the Tab class
protocol TabDelegate {
func didButtonTapped()
}
var delegate: TabDelegate?
@IBAction func btn1(sender: UIButton) {
delegate?.didButtonTapped()
}
In the viewController where use the Tab. Set the delegate like this
let tab = Tab()
tab.delegate = self
Then push the new viewController in the delegate method And you can make a BaseViewController to do this, then all the viewController subClass it can have the same feature.
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 {
}
Add a property to this class, then your can use the methods of controller.
weak var controller:UIViewController!
self.controller?.presentViewController(vc, animated: true, completion: nil)
来源:https://stackoverflow.com/questions/34649173/how-can-i-call-presentviewcontroller-in-uiview-class