无法在 AppDelegate 中初始化委托,但在类方法中它可以工作

Posted

技术标签:

【中文标题】无法在 AppDelegate 中初始化委托,但在类方法中它可以工作【英文标题】:Can't initializing a delegate in the AppDelegate but inside a class method it works 【发布时间】:2015-07-22 08:52:36 【问题描述】:

我正在尝试在didFinishLaunchingWithOptions 方法内的 AppDelegate 中初始化一个委托 (MyDelegate),如下所示:

UIStoryboard *myStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
[[someClassName instance] setMyDelegate:[myStoryboard instantiateViewControllerWithIdentifier:@"someVcName"]];

在调试的时候,所有的调用都运行良好,但是经过上述调用返回AppDelegate时,MyDelegate为nil。

有趣的是,当我尝试在我编写的类方法中设置委托时,它可以工作 - 与上面完全相同的代码。

为什么初始化在 AppDelegate 中不起作用,而在类方法中起作用?

谢谢。

编辑

基本上 @Leo 解决了这个问题,但解决方案非常简单,因为我使用的是 Storyboard 然后第一个 ViewController 会自动启动(假设您分配了入口点箭头图标):

解决办法:

[[someClassName instance] setMyDelegate:[self.window rootViewController]];

【问题讨论】:

你打印出来是不是真的得到Appdelgate类对象? 我听不懂你的问题哥们 NSLog (@"%@",[myStoryboard instantiateViewControllerWithIdentifier:@"someVcName"]);检查它是否为零 刚刚做了,但没有。正如我在问题中所写:确切的代码在类方法中初始化 MyDelegate 而在 AppDelegate 中却不是。 是的,哥们,我收到了你的问题,我只是在设置委托之前告诉你,只需检查它是否获得了 appDelegate 对象,然后你可以对它们设置删除,可能是你正在创建 AppDelegate 对象以错误的方式,因为我告诉你打印那条线并检查它的对象是否完美。 Leo 也试图在他的回答中做同样的事情 【参考方案1】:

关于方法instantiateViewControllerWithIdentifier

来自文档

此方法在您每次调用时都会创建指定视图控制器的新实例。

所以,在didFinishLaunchingWithOptions 中,您创建了一个本地 viewController 实例。

而且,方法完成后会被释放。

【讨论】:

谢谢。那么如何设置 MyDelegate 全局而不是本地? 这取决于具有此“someVcName”标识符的视图控制器何时加载到内存中。我无法从您发布的代码中弄清楚。为什么要将代理设置为didFinishLaunchingWithOptions 中的viewController。此时它没有加载到内存中。这意味着什么 究竟是什么没有加载到内存中?视图控制器? 是的,此时通常只创建window.rootViewController

以上是关于无法在 AppDelegate 中初始化委托,但在类方法中它可以工作的主要内容,如果未能解决你的问题,请参考以下文章

从 Appdelegate 设置 iBeacon 操作和监控

来自appDelegate performSegue的Swift 3在谷歌登录后无法正常工作

在 AppDelegate 中实例化初始 UIViewController

无法访问 AppDelegate 变量

应用程序委托问题,MonoTouch

在哪里存储持久容器(或任何全局对象)? AppDelegate 还是场景委托?