首页 > 解决方案 > 以编程方式添加按钮会导致致命错误

问题描述

我正在创建一个对象检测应用程序,我目前让它在结果周围生成边界框。每次检测到新对象时,我都想创建一个按钮,以便能够导航到该对象的描述页面。我在 View Controller 之外的文件中生成观察结果,但我正在 ViewController 中创建按钮。我知道标题不是nil,但是当我添加子视图时出现致命错误。一旦检测到对象,我调用:

 ViewController().showDetailView(buildingName: String(observationName))

然后在 View Controller 中运行:

public func showDetailView(buildingName: String){ 
    let detailViewButton = UIButton() 

    detailViewButton.setTitle(buildingName, for: .normal) 

    detailViewButton.frame = CGRect(x:0,y:0,width:200,height: 100) 

    resultView.addSubview(detailViewButton) // error here

    _ = Timer.scheduledTimer(withTimeInterval: 10.0, repeats: false) { timer in 
    detailViewButton.removeFromSuperview() 
    } 
}
------------------------------------------------------------------------

最后,一旦检测到对象,我就会收到此错误:

Thread 1: Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value

我已经研究了这个问题并找到了解决方案(例如确保按钮与情节提要正确链接),但它们似乎并不适用,因为我想以编程方式创建按钮。

标签: iosswiftswift5

解决方案


如果被声明为,你打电话showDetailView(buildingName: String)太早了resultView

@IBOutlet var resultView: UIView!

当你打电话时

ViewController().showDetailView(buildingName: String(observationName))

视图层次结构尚未创建。

但是我不确定您要达到什么目的,因为您的陈述没有任何意义,因为ViewController在任何地方都没有。

确保在将实例添加到窗口showDetailView后调用。ViewController


推荐阅读