无法从 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
之前,IBOutlet
是 nil
。 viewDidLoad
没有发生,因为您尝试通过调用 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()
这样您的IBOutlet
s 将有机会在您运行test()
方法之前进行初始化。
【讨论】:
以上是关于无法从 AppDelegate 调用 ViewController 方法的主要内容,如果未能解决你的问题,请参考以下文章
如何快速添加从我的 appdelegate 类调用的弹出窗口?
从 AppDelegate 外部调用放置在 AppDelegate 中的 UIActionSheet