无法在 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在谷歌登录后无法正常工作