ViewController() 比 appDelegate() 先调用?

Posted

技术标签:

【中文标题】ViewController() 比 appDelegate() 先调用?【英文标题】:ViewController() is called first than appDelegate()? 【发布时间】:2013-03-25 10:28:50 【问题描述】:

在我的应用程序中,在 appDelegate 文件中,我注册了获取令牌并获取设备 UDID 的毛皮推送通知。我将这些变量保存为全局变量。

接下来我要做的是在我的 viewController 中使用这两个变量连接到一个 URL。

但是,当我从我的 viewController 调用变量时,它们是(null)。

所以我想也许我对他们做错了什么。但即使当我在 appdelegate() 和 viewcontroller() 上 nslog 时,它也会首先从 viewcontroller 上 nslog...

这怎么可能,因为我的新功能是 appdelegate 首先运行,其次我将如何在 viewcontroller 中使用我在 appdelegate 上获得的 token 和 udid 变量?

我的代码如下所示:

@interface 之前的 appdelegate.h 中:

extern NSString *newDeviceToken;
extern NSString *udid;

@implementation 之前的 appdelegate.m 中:

NSString *newDeviceToken;
NSString *udid;

在我的视图控制器中,我只需导入委托:

#import "AppDelegate.h"

【问题讨论】:

你能告诉我们你的代码吗? 发布您的 applicationDidFinshLaunch 代码 【参考方案1】:

委托方法:

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken

您应该获取变量的位置是异步运行的。 是的,它可能会在您的 RootViewController 初始化后被调用。

您不应该在 ViewController 上执行 URL 连接,因为您可能还没有访问令牌。 您应该在它自己的委托方法上执行此操作。

现在,如果您想使用 ViewController 的功能并且不想在 AppDelegate 中进行服务器通信,请在 AppDelegate 中获取对 ViewController 的引用,将 ViewController 上的 URL 函数公开,然后调用它.

至于获取您的 ViewController 的引用,这将很难回答,不知道您的应用程序的设计。

假设您的 App 的 RootViewController 是 NavigationController,假设 NavigationController RootViewController 被命名为 HomeNewViewController,这就是您从 App Delegate 获取指向它的指针引用的方式:

NavigationController *navigationController = (NavigationController*) [self.window rootViewController];

HomeNewViewController *homeController = (HomeNewViewController*)[navigationController.viewControllers objectAtIndex:0];

那么假设在 HomeNewViewController 中有一个名为 uploadToken 的函数。

然后你可以这样做: [homeController uploadToken];

然后上传。

【讨论】:

谢谢Leftos。我现在正在看。 Χρόνια πολλά。 你的意思是在你的 appdelegate 中获得对你的视图控制器的引用然后调用公共函数?你能举个例子吗? 我已经编辑了我的答案,但这对您的应用程序设计做出了假设。【参考方案2】:

application:didRegisterForRemoteNotificationsWithDeviceToken 不会在调用[UIApplication registerForRemoteNotificationTypes:] 后立即调用。

这意味着您可以期望在加载视图时拥有令牌。将您的 UI 与连接代码分开。您的连接必须在调用 application:didRegisterForRemoteNotificationsWithDeviceToken 时触发,而不是在视图控制器生命周期的某个时间点。请注意,在调用application:didRegisterForRemoteNotificationsWithDeviceToken 之前,还会有一个对话框要求用户批准。

【讨论】:

很公平,但为什么我什至看不到设备 udid?我只是这样理解: NSString *udid = [[UIDevice currentDevice] uniqueIdentifier];这应该立即调用吧? [UIDevice uniqueIdentifier]ios 5 中已被弃用。不要指望它会再返回一些数据。 它确实在 appdelegate 中返回了一些数据。 @donparalias 如果没有看到有问题的代码,这很难回答。但是,如果您的应用程序使用[UIDevice uniqueIdentifier],您的应用程序将被应用商店拒绝。 我们商店里已经有 2 个应用程序在使用它。也已弃用意味着它可能很快就会停止工作。不是说它不工作吗?因为我的应用程序在 ios6 上也运行良好。最后苹果怎么知道我在用这个方法呢?

以上是关于ViewController() 比 appDelegate() 先调用?的主要内容,如果未能解决你的问题,请参考以下文章

iPhone,iOS 8:如何呈现比原始视图控制器更小的 ViewController?

从 appdelegate 更新视图控制器 - 最佳实践?

以编程方式将按钮添加到 UINavigationController

Incompatible pointer types assiging to "UIViewController" *_Nullable' from 'AppDel

ViewController或ViewSource?

一位代表,到 ViewController 好吗?