Не удается вызвать метод 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()
Таким образом, ваш IBOutlet
s будет иметь возможность инициализировать перед запуском test()
метод.