【问题标题】:How to push a new view controller from a view如何从视图中推送新的视图控制器
【发布时间】:2020-11-24 06:52:25
【问题描述】:

我在 .xib 中创建了一个视图。在它上面,我放置了一个我想打开另一个 ViewController 的按钮。我为这个 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 - 没有结果。

【问题讨论】:

  • 你不能从 UIView 推送...
  • 你需要询问UIView所在的控制器
  • 我该怎么做?
  • 你在哪里使用MyView
  • 我必须使用委托?

标签: ios swift uiview uiviewcontroller storyboard


【解决方案1】:

看来你有不止一个问题。

  1. 您正试图将UIViewController 推送到未呈现的UINavigationController
  2. 您正在使用标识符错误的 UIStoryboard 创建实例

首先,您需要选择正确的UIStoryboard,我假设它是ma​​in,然后您必须从持有人UIViewController 那里出示UINavigationController,或者尝试从该@987654327 推送@如果有UINavigationController

第 1 部分:修复实例,

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

现在你有一个navigationController,其中包含你的VC

第 2 部分:您想从您的控股 VC 中显示此导航,您可以从该 VC 添加一个侦听器到 UIButton 并从那里显示/推送

所以让我们把它包装起来,在你的 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 UIViewController

【讨论】:

  • 我的项目中有几个故事板,我不使用主故事板,而是通过代码工作。对于 ViewController,我创建了一个单独的故事板,在这个故事板中,我为 ViewController 添加了一个 NavigationController
  • 使用包含您要呈现的vc 的情节提要。使用文件名
  • 如果情节提要名称viewcontroller我建议你改成别的东西
  • 我应该添加 func @objc func pushToMyVc() { ...navigationController.pushViewController(vc, animated: true)} 吗?
  • 我按照你说的做了,但由于某种原因,按下按钮时什么也没有发生。我在didSelectRow func中的TableViewController(持有UIView)中使用此代码myView.selector = pushtoMyVC,对吗?
【解决方案2】:

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

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

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

请注意,情节提要 ID 必须完全是 ViewController

如果这仍然显示相同的错误,我会说你有故事板目标成员的问题,所以在 Xcode 编辑器右侧的文件检查器中检查。

【讨论】:

    【解决方案3】:

    您应该再次检查您的 Storyboard 文件名,因为当您想从 Storyboard 文件中启动 UIViewController 时,UIStoryboard 启动中的 name 参数必须与 Storyboard 文件名完全相同。

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

    希望这对您的问题有所帮助

    【讨论】:

      【解决方案4】:

      您应该将委托返回到包含当前视图的 viewController,并从那里调用 navigationController.push

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-11
        • 1970-01-01
        • 2016-10-22
        • 2023-04-09
        • 1970-01-01
        相关资源
        最近更新 更多