当前位置: 首页 > 知识库问答 >
问题:

将视图控制器添加为另一个视图控制器中的子视图

马淇
2023-03-14

我找到了一些关于这个问题的帖子,但是没有一个能解决我的问题。

说像我已经...

  1. ViewControlllerA
  2. ViewControlllerB

我试图将ViewControlllerB添加为ViewControlllerA中的子视图,但是,它抛出了一个错误,如"致命错误:意外地发现nil而展开可选值"。

下面是代码。。。

视图控制器

var testVC: ViewControllerB = ViewControllerB();

override func viewDidLoad()
{
    super.viewDidLoad()
    self.testVC.view.frame = CGRectMake(0, 0, 350, 450);
    self.view.addSubview(testVC.view);
    // Do any additional setup after loading the view.
}

ViewControllerB只是一个带有标签的简单屏幕。

视图控制器B

 @IBOutlet weak var test: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()
    test.text = "Success" // Throws ERROR here "fatal error: unexpectedly found nil while unwrapping an Optional value"
}

编辑

共有3个答案

慕意致
2023-03-14

代码适用于Swift 4.2。

let controller = self.storyboard!.instantiateViewController(withIdentifier: "secondViewController") as! SecondViewController
controller.view.frame = self.view.bounds
self.view.addSubview(controller.view)
self.addChild(controller)
controller.didMove(toParent: self)
岳凯康
2023-03-14

多亏了罗伯。为您的第二个观察添加详细的语法:

let controller:MyView = self.storyboard!.instantiateViewControllerWithIdentifier("MyView") as! MyView
controller.ANYPROPERTY=THEVALUE // If you want to pass value
controller.view.frame = self.view.bounds
self.view.addSubview(controller.view)
self.addChildViewController(controller)
controller.didMoveToParentViewController(self)

要卸下viewcontroller,请执行以下操作:

self.willMoveToParentViewController(nil)
self.view.removeFromSuperview()
self.removeFromParentViewController() 
鲁熙云
2023-03-14

以下是几点观察:

>

  • 实例化第二个视图控制器时,调用的是ViewControllerB()。如果视图控制器以编程方式创建它的视图(这是不寻常的),那就好了。但是,IBOutlet的存在表明第二个视图控制器的场景是在Interface Builder中定义的,但是通过调用ViewControllerB(),您并没有给故事板一个实例化该场景并连接所有插座的机会。因此,隐式展开的UILabelnil,导致错误消息。

    相反,您希望在Interface Builder中给您的目标视图控制器一个故事板id,然后您可以使用instantiateViewController(带标识符:)来实例化它(并连接所有IB插座)。在Swift 3中:

    let controller = storyboard!.instantiateViewController(withIdentifier: "scene storyboard id")
    

    您现在可以访问此控制器视图

    但是,如果您确实想执行添加子视图(即,您没有过渡到下一个场景),那么您正在进行一种称为“视图控制器包含”的练习。您不仅仅想简单地添加子视图。您希望执行一些附加的容器视图控制器调用,例如:

    let controller = storyboard!.instantiateViewController(withIdentifier: "scene storyboard id")
    addChild(controller)
    controller.view.frame = ...  // or, better, turn off `translatesAutoresizingMaskIntoConstraints` and then define constraints for this subview
    view.addSubview(controller.view)
    controller.didMove(toParent: self)
    

    有关为什么需要此addChild(以前称为addChildViewController)和didMove(toParent:)(以前称为didMove(toParentViewController:))的更多信息,请参阅WWDC 2011视频#102-实现UIViewController包容。简而言之,您需要确保视图控制器层次结构与视图层次结构保持同步,并且这些对addChilddidMove(toParent:)的调用确保了这种情况。

    另请参见《视图控制器编程指南》中的创建自html" target="_blank">定义容器视图控制器。

    顺便说一句,上面说明了如何通过编程实现这一点。如果在Interface Builder中使用“容器视图”,实际上会容易得多。

    这样,您就不必担心任何与容器相关的调用,Interface Builder将为您处理这些调用。

    有关Swift 2的实施,请参见本答案的先前版本。

  •  类似资料:
    • 问题内容: 我没有找到有关此问题的文章,但没有一个解决我的问题。 就像我说的那样。 ViewControllerA ViewControllerB 我试图将添加为的子视图,但是它 抛出类似“ ” 的错误。 下面是代码… ViewControllerA ViewControllerB只是一个带有标签的简单屏幕。 ViewControllerB EDIT 根据用户答案的​​建议解决方案,ViewCon

    • 以下的一段代码相当于定义一个ParameterizableViewController视图控制器的快捷方式,该控制器会立即将一个请求转发(forwards)给一个视图。请确保仅在以下情景下才使用这个类:当控制器除了将视图渲染到响应中外不需要执行任何逻辑时。 以下是一个例子,展示了如何在MVC Java编程配置方式下将所有"/"请求直接转发给名字为"home"的视图: @Configuration

    • 问题内容: 我有一个storyviewcontroller,它的视图上有对象。我需要更改UILabel(在storyviewcontroller中)上的文本,并将视图加载到数组上。我已将IBOutlet连接到storyviewcontroller中的标签。 我已经创建了storyviewcontroller类的对象,并且能够访问其变量。但是,在创建storyviewcontroller的对象之后,

    • 我想做的是: 由父视图控制器管理的父视图不应旋转。 由子视图控制器管理的子视图应该旋转到所有方向。 我所尝试的: 家长视图控制器 儿童视图控制器 Xcode部署信息中支持的方向设置为所有四个。 我得到的: 没有视图的旋转。如果将父视图的旋转设置为“全部”,则所有视图将一起旋转。所以要么全有要么全无。 更新 当我尝试放置UIDeviceOrientationIDChangeNotification的

    • CodeIgniter 的开发基于 MVC(模型-视图-控制器)设计模式。MVC 是一种 用于将应用程序的逻辑层和表现层分离出来的软件方法。在实践中,由于这种分离 所以你的页面中只包含很少的 PHP 脚本。 模型 代表你的数据结构。通常来说,模型类将包含帮助你对数据库进行增删改查的方法。 视图 是要展现给用户的信息。一个视图通常就是一个网页,但是在 CodeIgniter 中, 一个视图也可以是一

    • 问题内容: 我一直试图将我的视图控制器弹出到我的视图堆栈中的以前的视图控制器之一。假设在我的视图堆栈中有 firstVC,secondVC,thirdVC和fourthVC 视图 控制器 。当前的视图控制器是第四个,在fourthVC中有一个表视图。如果用户删除tableview中的所有行,则应将用户 定向 到 secondVC 。我有一个想法,我将创建另一个Navigationcontrolle