当前位置: 首页 > 面试题库 >

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

李敏学
2023-03-14
问题内容

我没有找到有关此问题的文章,但没有一个解决我的问题。

就像我说的那样。

  1. ViewControllerA
  2. ViewControllerB

我试图将ViewControllerB添加为ViewControllerA的子视图,但是它
抛出类似“ fatal error: unexpectedly found nil while unwrapping an Optional value” 的错误。

下面是代码…

ViewControllerA

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只是一个带有标签的简单屏幕。

ViewControllerB

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

EDIT

根据用户答案的​​建议解决方案,ViewControllerA中的ViewControllerB不在屏幕上。灰色边框是我


问题答案:

一些观察:

  1. 实例化第二个视图控制器时,您正在调用ViewControllerB()。如果该视图控制器以编程方式创建其视图(这是不寻常的),那就很好了。但是,IBOutlet建议的存在暗示了第二个视图控制器的场景是在Interface Builder1z中定义的,但是通过调用ViewControllerB(),您并没有给情节提要板实例化该场景并连接所有出口的机会。因此,隐式解包的UILabel是nil,导致出现错误消息。
    相反,您想在Interface Builder中为目标视图控制器提供一个“ storyboard id” ,然后可以使用
    instantiateViewController(withIdentifier:)它实例化(并连接
    所有IB插座)。在Swift 3中
    let controller = storyboard!.instantiateViewController(withIdentifier: "scene storyboard id")
    


You can now access this controller‘s view.

  1. But if you really want to do addSubview (i.e. you’re not transitioning to the next scene), then you are engaging in a practice called “view controller containment”. You do not just want to simply addSubview. You want to do some additional container view controller calls, e.g.:
    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)

For more information about why this
addChild
(previously called addChildViewController) and
didMove(toParent:)
(previously called didMove(toParentViewController:)) are necessary, see
WWDC 2011 video #102 - Implementing UIViewController
Containment. In short,
you need to ensure that your view controller hierarchy stays in sync with your
view hierarchy, and these calls to addChild and didMove(toParent:) ensure
this is the case.

另请参阅 《View Controller编程指南》中的“ 创建自定义容器View
Controller ”。

顺便说一句,以上说明了如何以编程方式执行此操作。它
实际上是容易得多,如果您使用界面生成器“容器视图”。

在此处输入图片说明

这样,您就不必担心与这些与收容相关的任何呼叫,
Interface Builder会为您解决。

For Swift 2 implementation, see previous revision of this
answer.



 类似资料:
  • 我找到了一些关于这个问题的帖子,但是没有一个能解决我的问题。 说像我已经... ViewControlllerA ViewControlllerB 我试图将ViewControlllerB添加为ViewControlllerA中的子视图,但是,它抛出了一个错误,如""。 下面是代码。。。 视图控制器 ViewControllerB只是一个带有标签的简单屏幕。 视图控制器B 编辑

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

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

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

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

  • 问题内容: 题 如何仅使用按钮的touch up内部事件从一个视图控制器导航到另一个视图控制器? 更多信息 我在一个示例项目中尝试执行的步骤是: 创建示例单视图应用程序。 为用户界面(ViewController2)添加一个新文件->具有XIB的Objective-C类。 在ViewController.xib中添加一个按钮,并控制单击ViewController.h的按钮以创建内部补全事件。 转