从AppDelegate访问ViewController

时间:2013-02-12 17:31:14

标签: ios objective-c xcode

我的问题如下,

在我的一个ViewControllers中,当用户点按一个按钮时,我会使用此代码注册设备以获取通知。

[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];

然后,在AppDelegte中,有两种方法。一个接收令牌,另一个收到错误。

- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
- (void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(NSError*)error

现在出现了问题,在didRegisterForRemoteNotificationsWithDeviceToken我需要将令牌发送到我的服务器,并使用它输入用户在View中输入的一些数据,就像它的用户名一样。

如何获取此数据?

2 个答案:

答案 0 :(得分:9)

NSNotificationCenter会很好地为您服务。在AppDelegate的didRegisterForRemoteNotificationsWithDeviceToken中,执行以下操作:

[[NSNotificationCenter defaultCenter] postNotificationName:@"RegistrationReceived"
                                                    object:token];

并且,在您的控制器的viewDidLoad

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(updateRegistrationInfo:)
                                             name:@"RegistrationReceived" 
                                           object:nil];

确保实现-updateRegistrationInfo:(或任何你想要命名的东西)来接收NSNotification和令牌,它作为参数传入。此外,当您不再需要时,请取消注册通知。

- (void)updateRegistrationInfo:(NSNotification *)notification
{
    NSString *myObject = [notification object];
    ...
}

答案 1 :(得分:1)

您可以将ViewController作为实例变量添加到AppDelegate类:

@interface AppDelegate : NSObject <UIApplicationDelegate>
{
@private // Instance variables

    UIWindow *mainWindow; // Main App Window

    UINavigationController *navigationController;

    UIViewController *someViewController;
}

然后向someViewController添加一些返回所请求数据的方法。

您可以通过以下方式在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions类的AppDelegate中分配someViewController:

someViewController = [[UIViewController alloc] initWithNibName:nil bundle:nil]; 

navigationController = [[UINavigationController alloc] initWithRootViewController:someViewController];