首先调用ViewController()而不是appDelegate()?

时间:2013-03-25 10:28:50

标签: ios uiviewcontroller delegates

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

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

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

所以我想也许我对他们做错了。但即使我在appdelegate()和viewcontroller()上发布了一些内容,它首先从viewcontroller中获取nslog ...

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

我的代码如下所示:

@interface之前的appdelegate.h中:

extern NSString *newDeviceToken;
extern NSString *udid;

@implementation之前的appdelegate.m中:

NSString *newDeviceToken;
NSString *udid;

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

#import "AppDelegate.h"

2 个答案:

答案 0 :(得分:1)

委托方法:

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

你应该得到你的变量,是异步运行的。 是的,它可能会在您的RootViewController初始化后调用。

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

现在,如果您想使用ViewController的一个功能而不想在AppDelegate中进行服务器通信,请在AppDelegate中获取对ViewController的引用,将ViewController上的URL函数设为public,并调用它

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

假设你的应用程序的RootViewController是一个NavigationController,让我们说NavigationController RootViewController被命名为HomeNewViewController,这就是你如何从App Delegate获取它的指针引用:

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

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

然后让我们说在HomeNewViewController中,你有一个名为uploadToken的函数。

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

并上传。

答案 1 :(得分:1)

调用application:didRegisterForRemoteNotificationsWithDeviceToken后,不会立即调用{p> [UIApplication registerForRemoteNotificationTypes:]

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