正在从 nib 文件所有者加载 ViewController

Loading a ViewController from nib file owner

我有一个用笔尖制作的设计,并且围绕所有 ViewControllers 我正在加载那个笔尖设计。

因为这是常见的页脚,所以我设法在所有其他视图控制器的页脚中使用它。

现在我想要什么:我希望每当用户单击页脚时,它必须启动一个新的视图控制器,它将显示您可以说的内容 "About us " 视图控制器.

我在做什么:

// ON CLICK OF FOOTER I AM DOING 
 let mAboutUs = self.storyboard?.instantiateViewController(withIdentifier: "idAboutUs") as! AboutUs
    mAboutUs.modalPresentationStyle = .fullScreen
    self.present(mAboutUs, animated: true) {

    }

但我收到以下错误

Value of type 'FooterView' has no member 'storyboard'

我的理解:我认为我们不能从nib文件开始一个新的ViewController,但我真的不想在所有其他视图控制器中做这个事情我在其中添加了这个笔尖(FooterView)作为每个视图控制器底部的页脚视图。

请帮帮我!!!

A UIView subclass 不包含 storyboard 属性 它用于 vc subclass ,你需要

let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "idAboutUs") as! AboutUs

如果你想从视图 FooterView 中呈现一个 vc 然后添加一个委托,比如

weak var delegate:VCName?

创建实例时

let ins = FooterView() // or from storyboard 
ins.delegate = self

然后使用

delegate?.present(mAboutUs, animated: true)

在视图的内部 class


您可以使用所有 vc 都符合的委托,但最简单的方法是添加此扩展

extension UIViewController {
    func topMostViewController() -> UIViewController {

        if let presented = self.presentedViewController {
            return presented.topMostViewController()
        }

        if let navigation = self as? UINavigationController {
            return navigation.visibleViewController?.topMostViewController() ?? navigation
        }

        if let tab = self as? UITabBarController {
            return tab.selectedViewController?.topMostViewController() ?? tab
        }

        return self
    }
}

然后

 guard let currentVC =  (UIApplication.shared.delegate as! AppDelegate).window?.rootViewController.topMostViewController() else { return } 
 currentVC.present(mAboutUs, animated: true)

您的代码应与此类似:

let vc = UIStoryboard(name: "<Name of the storyboard that contains the About Us VC>", bundle: nil).instantiateViewController(withIdentifier: "idAboutUs") as! AboutUs

self.present(vc, animated: true) {

    }