无法从 AppDelegate 调用 ViewController 方法

Posted

技术标签:

【中文标题】无法从 AppDelegate 调用 ViewController 方法【英文标题】:Can't call ViewController method from AppDelegate 【发布时间】:2015-05-12 03:12:02 【问题描述】:

在 AppDelagate 中,我在方法中调用以下内容

func example() 
    ViewController().test()

在我的 ViewController 中,方法是

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

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

【问题讨论】:

以您没有从情节提要创建它的方式创建 ViewController 的实例。我假设您的 testView 是一个 IBOutlet? testView 是一个 IBOutlet 你在appDelegate中导入ViewController了吗? 我试过了,但由于某种原因它不起作用 将您的 ViewController 命名为其他名称,因为 ViewController 是 ViewController 的默认类名 【参考方案1】:

在视图控制器调用 viewDidLoad 之前,IBOutletnilviewDidLoad 没有发生,因为您尝试通过调用 ViewController() 直接实例化类。

因此,正如预期的那样,testView 为零。无论如何,您的AppDelegate 不应对ViewController 逻辑负责。

【讨论】:

在完成viewDidLoad方法后仍然崩溃 它没有完成viewDidLoad方法。【参考方案2】:

您现在可能知道,您的崩溃是因为您在访问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()

这样您的IBOutlets 将有机会在您运行test() 方法之前进行初始化。

【讨论】:

以上是关于无法从 AppDelegate 调用 ViewController 方法的主要内容,如果未能解决你的问题,请参考以下文章

如何快速添加从我的 appdelegate 类调用的弹出窗口?

从 AppDelegate 外部调用放置在 AppDelegate 中的 UIActionSheet

从 appdelegate 展示一个视图控制器

从 appDelegate 调用 viewdidload

从 AppDelegate 调用 navigationController

从 AppDelegate 调用委托函数不起作用