Не удается вызвать метод ViewController из AppDelegate

В AppDelagate я вызываю следующее в методе

func example() {
    ViewController().test()
}

и в моем ViewController метод

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

но происходит сбой всякий раз, когда я вызываю метод, из-за нулевой ошибки с testView. testView - это представление в ViewController, а не в AppDelegate, но я не знаю, как сделать так, чтобы метод выполнялся так, как если бы я вызывал его во ViewController.

2 ответа

IBOutlet является nil пока контроллер представления не вызывает viewDidLoad, viewDidLoad не произошло, так как вы пытались создать экземпляр класса напрямую через вызов ViewController(),

Таким образом, testView ноль, как и ожидалось. Ваш AppDelegate не должен нести ответственность за ViewController логика в любом случае.

Как вы уже знаете, ваш сбой происходит из-за того, что вы получаете доступ к IBOutlet прежде чем он получит возможность быть инициализированным. Так что я угадываю testView объявлен вроде как это:

@IBOutlet weak var testView: UIView!

Решение А

Вместо этого вы можете включить его необязательно, чтобы избежать этого сбоя:

@IBOutlet weak var testView: UIView?

И измените синтаксис в вашем VC:

testView?.userInteractionEnabled = true

Решение Б

Если вам действительно нужно отключить взаимодействие с пользователем на этом этапе, вы можете принудительно загрузить представление:

let myVc = ViewController()
_ = myVc.view // this will force the myVc.view to be loaded
myVc.test()

Таким образом, ваш IBOutlets будет иметь возможность инициализировать перед запуском test() метод.

Другие вопросы по тегам