【问题标题】:Loading a ViewController from nib file owner从 nib 文件所有者加载 ViewController
【发布时间】:2019-12-31 16:04:40
【问题描述】:

我有一个用 nib 设计的设计,并且在所有 ViewControllers 中我正在加载该 nib 设计。

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

现在我想要什么:我希望每当用户单击页脚时,它必须启动一个新的视图控制器,该控制器将显示您可以说“关于我们”视图控制器的内容。

我在做什么:

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

    }

但我收到以下错误

“FooterView”类型的值没有成员“故事板”

我的理解:我认为从 nib 文件中我们无法启动新的 ViewController,但我真的不想在我添加了这个 nib (FooterView) 的所有其他 View 控制器中做这件事作为每个视图控制器底部的页脚视图。

请帮帮我!!!!

【问题讨论】:

    标签: ios swift iphone xcode10 swift4.2


    【解决方案1】:

    UIView 子类不包含 storyboard 属性,它用于 vc 子类,您需要

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

    如果你想从 inisde 视图 FooterView 中展示一个 vc,那么添加一个像这样的委托

    weak var delegate:VCName?
    

    创建实例时

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

    然后使用

    delegate?.present(mAboutUs, animated: true)
    

    在视图的类中


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

    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)
    

    【讨论】:

    • 如果我想以模态方式呈现它怎么办?
    • 老兄,我没明白,我只是想在以前的视图控制器上方模态显示它
    • 我没有创建任何 CustomView 实例,我只是使用 Storyboard 添加它
    • FooterView = CustomView
    • 我是通过 footerView = customview 找到你的,但我添加的是使用情节提要,而不是编程方式
    【解决方案2】:

    您的代码应如下所示:

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

    【讨论】:

    • 但 self.present 出错,因为 present 不是 nib 文件中提供的方法
    • 你可以像这样在 viewController 中调用它:self.present(, animated: , completion: Void)?##(() -> Void)?##() -> Void#>)
    • 我没有视图控制器,我有一个 nib 文件
    • 所以它可能是一个视图,然后你可以将页脚的动作发送到封装它的VC。从那里您可以运行此代码
    • 所以这意味着我必须在所有视图控制器中工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    相关资源
    最近更新 更多