ios - 将 UIContainerView 嵌入到表视图中并尝试通过 @IBOutlet 访问导致 Unexpectedly found nil
问题描述
使用Apple 相当古老的 Swift Getting Started教程作为基础,我有一个可以工作的应用程序。我想在表格顶部添加一个 UIView,以在发生错误时临时显示。不幸的是,当尝试从 UIView 的关联类访问 UI 元素时,我收到“在隐式展开可选值时意外发现 nil”错误。
这实际上是一个 UIContainerView,但显然是以 UIView 的形式出现的。
我已经将UIView和链接视图(通过嵌入 segue)子类化为一个名为 ErrorView 的子类,并在表视图的子类中添加了一个指向 UIView 的@IBOutlet 链接。UI 元素通过@IBOutlet 链接到ErrorView 类。
当通过表子类中的 @IBOutlet 访问 ErrorView 类成员时,一切都很花哨,直到 ErrorView 类尝试访问其 @IBOutlet 链接元素,此时它崩溃并显示“在隐式解包 Optional 值时意外发现 nil”。
奇怪的是,从错误类中访问视图本身是可能的,因此我可以做一些与视图相关的事情,比如在没有错误的情况下改变它的颜色——尽管颜色改变实际上并没有发生。
下面是一个非常精简的代码版本,它应该会重现该问题。
我正在使用 iOS13 和 Xcode 11 测试版。
错误视图.swift
import UIKit
class ErrorView: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder: NSCoder) {
super.init(coder: coder)
}
@IBOutlet weak var uiMessage: UILabel!
func setErrorMessage(errorMessage: String){
uiMessage.text=errorMessage //<-- error here
}
}
模块表视图控制器
import UIKit
import Foundation
class ModuleTableViewController: UITableViewController {
@IBOutlet weak var errorView: ErrorView!
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
errorView.setErrorMessage(errorMessage: "Hello")
}
}
解决方案
将视图拖到 tableView 上会创建一个.tableHeaderView
. 您可以使用UIContainerView
来自另一个视图控制器的视图,但除非您打算进行很多需要以这种方式处理的事情,否则最好使用简单的UIView
.
逐步尝试:
1)标准UITableViewController
,您的代码准备就绪(将控制器的自定义类分配给TestTableViewController
):
2)添加一个UIView
到表视图。给它一个背景颜色,以便于查看:
3)添加一个UILabel
到该视图。给它一个背景颜色,使其易于查看。在所有 4 个方面将其限制为 8 分:
4)将该视图的自定义类设置为您的ErrorView
类:
5) 连接@IBOutlet
s。从代码窗口中的圆圈单击并拖动(不是 Ctrl)到对象。您可能会发现拖到大纲窗格中的对象更容易(例如,当您尝试连接视图时,您不会意外连接标签):
6)现在应该是这样的(代码窗口中的实心圆圈表示插座已连接):
7)运行应用程序,你应该得到这个:
推荐阅读
- ruby-on-rails - AngularJS / Rails 移动会话仅持续一个小时
- google-cloud-storage - 如果我们在启用了 google-cloud-speech 的项目上启用数据记录,我们是否可以访问音频文件及其识别元数据?
- keras - keras中的UpSampling1D非常慢?
- android - React-native Android 应用程序不显示本地图片/资产
- android - Twilio 可编程视频 SDK 使 Android 应用程序在发布构建时崩溃
- ssl - 如何在 Protractor 中通过客户端证书和密钥进行 https 测试?
- javascript - 将 ES6 JavaScript 转换为 ES5 格式
- jekyll - 如何在 Jekyll/github-pages 托管网站上按班级组织笔记?
- node.js - 子集上的 MongoDB 多个条件
- excel - 正在打印空白/空列,因为它们已被使用,但现在未使用