我在
中定义了一个UIViewclass InteractViewController: UIViewController {
@IBOutlet weak var tipsView: UIView!
var tipslayer: CALayer {
return tipsView.layer
}
}
在类和标签中还附加了许多约束。
@IBOutlet weak var tips1Top: NSLayoutConstraint!
@IBOutlet weak var tips1Right: NSLayoutConstraint!
@IBOutlet weak var tipsTitle: UILabel!
@IBOutlet weak var tipsDesc: UILabel!
所有内容都在情节提要板上连接至正确的插座。在实际的InteractViewController本身中引用它们,我能够调整不透明度,更新图层上的标签等。
但是,除非用户首先使用该应用程序,否则不需要它们。如此简单的InteractViewController上的其他函数调用一个函数来显示和更新这些属性或根本不显示它们。
控制和更新这些属性的函数在另一个类中(项目中的Swift文件。
class TipsViewController: UIViewController {
func tips() {
InteractViewController().tipslayer.transform = CATransform3DMakeScale(0.8, 0.8, 1.0)
}
}
导致应用崩溃以创建
Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
上
return tipsView.layer (the InteractViewController)
tipsView和tipslayer的原因不是可选的,也不被声明为可选。
我有三个问题,希望可以得到帮助。
是否对ViewController类InteractViewController:UIViewController上的插座有物理引用?如果是这样,是因为应该以编程方式将它们添加到TipsViewController:UIViewController类(在Xcode中没有物理视觉视图控制器)上吗?
对
上的插座有物理参考吗InteractViewController类:UIViewController
如果在InteractViewController上从未调用第二个ViewContoller TipsViewController.tips()的函数,则会创建不必要的内存使用,因此,换句话说,问题1的答案实际上是应该以编程方式在lass TipsViewController:UIViewController上添加任何物理出口。 ?
我知道人们很忙,所以在此先说一下,我感谢所有对此问题的反馈和帮助。
有人建议我的问题是[What does "fatal error: unexpectedly found nil while unwrapping an Optional value" mean?
的重复项但这不是我的问题。我的问题专门涉及从另一个ViewController访问一个Outlet,然后再对该Outlet生成一个Nil响应,因为如前所述,InteractViewController显然没有引用ViewController。请阅读Rob提供的解释和答案,Rob会回答此特定问题。
答案 0 :(得分:0)
您的标题为“从另一个UIViewController类引用时,IBOutlet返回致命错误:”。最重要的是,一个视图控制器绝对不能访问另一个视图控制器的插座。
在代码段中,您使用InteractViewController()
语法。不幸的是,这只是实例化视图控制器,而没有在情节提要中连接插座。您需要通过情节提要进行实例化,即使这样,也不能立即引用出口,而只能在稍后调用viewDidLoad
之后。无论如何,只有视图控制器本身应该尝试访问其自己的出口。
TipsViewController()
或InteractViewController()
语法表示“创建该视图控制器的新空白实例”。相当于说TipsViewController.init()
或InteractViewController.init()
。而且,更糟糕的是,它根本不使用情节提要(因此不会连接任何插座)。那不是你想要的。您应该避免使用这种ViewController()
语法,因为出口将永远无法通过这种方式访问。
InteractViewController
应该确定是否显示TipsViewController
(例如,检查用户默认值),如果显示,则显示。 InteractViewController
唯一要做的是:
TipsViewController
; TipsViewController
;和InteractViewController
中检索到的任何UserDefaults
传递给为您创建的TipsViewController
实例。但是关于TipsViewController
如何呈现其子视图的所有内容,仅是TipsViewController
的权限。 InteractViewController
切勿直接与TipsViewController
的任何渠道互动。