ios - 将 UIContainerView 嵌入 TableView 并尝试通过 @IBOutlet 访问导致意外发现 nil

标签 ios swift ios13

使用 Apple's rather old Swift Getting Started教程作为基础,我有一个工作应用程序。我想在表格顶部添加一个 UIView,以便在发生错误时临时出现。不幸的是,当尝试从 UIView 的关联类访问 UI 元素时,我收到“在隐式展开可选值时意外发现 nil”错误。

https://imgur.com/wfqFach.png

这实际上是一个 UIContainerView,但显然显示为 UIView。

我已经将 UIView 都进行了子类化和 linked view (通过嵌入 segue)带有一个我称为 ErrorView 的子类,并在 TableView 的子类中添加了一个指向 UIView 的@IBOutlet 链接。 UI 元素通过@IBOutlet 链接到ErrorView 类。

当通过表子类中的@IBOutlet 访问 ErrorView 类成员时,一切都很好,直到 ErrorView 类尝试访问其 @IBOutlet 链接元素,此时它崩溃并显示“在隐式展开可选值时意外发现 nil。 "

奇怪的是,从错误类中访问 View 本身是可能的,因此我能够做一些与 View 相关的事情,比如无错误地改变它的颜色——尽管颜色改变实际上并没有发生。

下面是一个非常精简的代码版本,应该可以重现问题。

我使用的是 iOS13 和 Xcode 11 测试版。

错误 View .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
    }
}

模块 TableView Controller

import UIKit
import Foundation

class ModuleTableViewController: UITableViewController {
 @IBOutlet weak var errorView: ErrorView!

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        errorView.setErrorMessage(errorMessage: "Hello")
    }
}


最佳答案

事实上,容器 View 包含View Controller而不是UIView,你需要为你的error viewController设置一个UIViewController类,然后为你创建一个outlet UIlable,然后设置一个协议(protocol)并让你的Error View controller符合它,当一些东西会发生,它会更新标签文本。

关于ios - 将 UIContainerView 嵌入 TableView 并尝试通过 @IBOutlet 访问导致意外发现 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57778040/

相关文章:

ios - 将一次性电子邮件注册添加到我的应用程序的开头

ios - 在 iOS 13 中更改搜索栏占位符文本颜色

text-to-speech - 更新后某些用户的 iOS 13 文本转语音 (TTS - AVSpeechSynthesisVoice) 崩溃

ios - 更改类中常量的值

ios - 在 UIScrollView 中自动调整 UITextView 的大小

ios - 对相同大小的类别有不同约束的任何解决方法?

Iphone Simulator - 与设备相比分配太多内存并且运行缓慢

ios - 如何快速检查设备的互联网连接是否不佳

swift - 将 cryptoswift 分支到 2.3

ios - SCNRenderer 不在 iOS 13 上渲染 AVPlayer