无法从AppDelegate调用ViewController方法

时间:2015-05-12 03:12:03

标签: ios swift uiviewcontroller appdelegate

在AppDelagate中,我在方法

中调用以下内容
func example() {
    ViewController().test()
}

并且在我的ViewController中,方法是

func test() {
    testView.userInteractionEnabled = true
    buttonTapped(UIButton())
    restartTimer()
}

但是每当我调用该方法时它会崩溃,因为testView出现nil错误。 testView是ViewController中的一个视图,而不是AppDelegate中的视图,但我不知道如何制作它,所以方法执行就像我在ViewController中调用它一样。

2 个答案:

答案 0 :(得分:1)

IBOutletnil,直到视图控制器调用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()方法之前进行初始化。