在AppDelagate中,我在方法
中调用以下内容func example() {
ViewController().test()
}
并且在我的ViewController中,方法是
func test() {
testView.userInteractionEnabled = true
buttonTapped(UIButton())
restartTimer()
}
但是每当我调用该方法时它会崩溃,因为testView出现nil错误。 testView是ViewController中的一个视图,而不是AppDelegate中的视图,但我不知道如何制作它,所以方法执行就像我在ViewController中调用它一样。
答案 0 :(得分:1)
IBOutlet
为nil
,直到视图控制器调用viewDidLoad
。由于您尝试通过调用viewDidLoad
直接实例化该类,因此未发生ViewController()
。
因此,正如预期的那样testView
为零。无论如何,AppDelegate
不应对ViewController
逻辑负责。
答案 1 :(得分:0)
正如您现在所知,您的崩溃正在发生,因为您在获得初始化机会之前正在访问IBOutlet
。所以我猜测testView
被宣布为这样:
@IBOutlet weak var testView: UIView!
解决方案A
您可以将其设为可选,以避免此次崩溃:
@IBOutlet weak var testView: UIView?
将VC中的语法更改为:
testView?.userInteractionEnabled = true
解决方案B
如果此时确实需要关闭用户交互,则可以强制加载视图:
let myVc = ViewController()
_ = myVc.view // this will force the myVc.view to be loaded
myVc.test()
这样,您的IBOutlet
将有机会在运行test()
方法之前进行初始化。