ios 如何在UIView类中调用presentViewController?

xdnvmnnf  于 2023-02-10  发布在  iOS
关注(0)|答案(4)|浏览(175)

在我的项目中有一个自定义选项卡,它位于应用程序的每个屏幕上,所以我做了自定义UIView类和xib文件,并在其中添加了按钮。现在我希望我的按钮在不同的屏幕上导航有不同的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
} 
}
vohkndzv

vohkndzv1#

在按钮上调用此函数

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)

    }

此函数将创建根视图控制器

func getCurrentViewController() -> UIViewController? {

    if let rootController = UIApplication.shared.keyWindow?.rootViewController {
        var currentController: UIViewController! = rootController
        while( currentController.presentedViewController != nil ) {
            currentController = currentController.presentedViewController
        }
        return currentController
    }
    return nil

}

上述代码必须工作,它在Swift 4.0中对我有效

gv8xihay

gv8xihay2#

可以使用delegate。将其添加到Tab类中

protocol TabDelegate {

    func didButtonTapped()
}

var delegate: TabDelegate?

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

在使用Tab的viewController中,如下设置委托

let tab = Tab()
tab.delegate = self

然后在delegate方法中推送新的viewController,你可以创建一个BaseViewController来完成这个操作,然后所有的viewController子类都可以有相同的特性。

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 {
}
ezykj2lf

ezykj2lf3#

在这个类中添加一个属性,然后你就可以使用控制器的方法了。
弱变量控制器:UIViewController!
自我控制器?.presentViewController(vc,动画:真,完成:无)

x3naxklr

x3naxklr4#

您可以使用window来表示您的UIView Class中的任何ViewController。在您的UIView中,只需写入以下行。

let yourViewController = UIViewController() // for example
self.window?.rootViewController?.present(yourViewController, animated: true, completion: nil)

干杯!

相关问题