如何从视图推送新的视图控制器

时间:2020-08-04 07:53:27

标签: ios swift uiview uiviewcontroller storyboard

我在.xib中创建了一个视图。在上面,我放置了一个按钮,要在该按钮上打开另一个ViewController。我为此故事控制器分配了一个StoryboardID。但是我不能推新的控制器,这个问题怎么解决?

我的代码:

class MyView: UIView {
...
   @IBAction func buttonPressed(_ sender: Any) {
        let storyboard = UIStoryboard.init(name: "ViewController", bundle: Bundle.init())
        let vc = storyboard.instantiateViewController(withIdentifier: "VC") as! ViewController
        let navigationController = UINavigationController.init()
        navigationController.pushViewController(vc, animated: true)
   }
...
}

class ViewController: UIViewController {
...
}

Xcode出现此错误:

“找不到名为'ViewController'的故事板

但是我检查了没有错误。我重新加载了Xcode-没有结果。

4 个答案:

答案 0 :(得分:0)

似乎您有多个问题。

  1. 您正在尝试将UIViewController推入未显示的UINavigationController
  2. 您正在从UIStoryboard创建实例且标识符错误

首先,您需要选择正确的UIStoryboard(我假设它是主要),然后您必须出示UINavigationController来自持有人UIViewController或尝试如果有UIViewController,则从该UINavigationController进行推送,

第1部分:修复实例,

let storyboard = UIStoryboard.init(name: "main", bundle: Bundle())
let vc = storyboard.instantiateViewController(withIdentifier: "VC") as! ViewController
let navigationController = UINavigationController(rootViewController: vc)

现在您拥有一个navigationController的{​​{1}}

第2部分:您想从您的持股VC中呈现此导航,您可以从该VCUIButton添加一个侦听器,然后从那里显示/推送

因此,让我们总结一下,在您的VC中创建一个包含VC的函数

UIView

然后在您的@objc func pushToMyVc() { let storyboard = UIStoryboard.init(name: "main", bundle: Bundle()) let vc = storyboard.instantiateViewController(withIdentifier: "VC") as! ViewController let navigationController = UINavigationController(rootViewController: vc) } 中添加此变量UIView

现在var selector: (() -> Void)? 中调用此函数@IBAction func buttonPressed

现在,我们需要的是传递单击该按钮时要使用的功能(在我们的案例中,该功能selector?()我们放置在主pushToMyVC中,因此在我们的UIViewController中或您在哪里调用此自定义视图

像这样设置选择器

didLoad

侧面说明:您不能从非显示/推送myView.selector = pushtoMyVC UIViewController个课程

答案 1 :(得分:0)

尝试更改从中获取情节提要的方式

let storyboard = UIStoryboard.init(name: "ViewController", bundle: Bundle.init())

let storyboard = UIStoryboard(name: "ViewController", bundle: nil)

请注意,情节提要ID必须精确为ViewController

如果仍然显示相同的错误,我想说您是情节提要目标成员身份存在问题,因此请在Xcode编辑器右侧的文件检查器中进行检查。

答案 2 :(得分:0)

您应该再次检查Storyboard文件的名称,因为要从Storyboard文件初始化UIViewController时,name初始化中的UIStoryboard参数必须与故事板文件名。

@IBAction func buttonPressed(_ sender: Any) {
    // Let's say that you have a Storyboard file named ViewController.storyboard and a UIViewController class named ViewController.swift
    let destinationVC = UIStoryboard(name: "ViewController", bundle: nil).instantiateViewController(withIdentifier: "VC") as! ViewController
    self.navigationController?.pushViewController(destinationVC, animated: true)
}

希望这可以解决您的问题

答案 3 :(得分:-1)

您应该带一个代表回到包含当前视图的viewController,然后从那里调用navigationController.push