如何在接收并点击推送通知时显示特定的UIViewController

时间:2015-04-27 18:20:59

标签: ios objective-c uiviewcontroller

我想在收到推送通知并且用户点击该通知时显示特定的UIViewController。我做了一些研究并尝试了一些没有成功的事情。

我尝试了以下代码,它适用于UIAlertController,但它没有显示我想要的特定UIViewController。请帮帮我。我正在使用Xcode 6.3。

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    NSDictionary *userInfo = [launchOptions valueForKey:@"UIApplicationLaunchOptionsRemoteNotificationKey"];
    NSDictionary *apsInfo = [userInfo objectForKey:@"aps"];

    if(apsInfo) {

        UIStoryboard *myStoryBoard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
        notificationViewController *nvc = [myStoryBoard instantiateViewControllerWithIdentifier:@"notificationViewController"];

        [self.window.rootViewController presentViewController:nvc animated:YES completion:nil];
    }

    return YES;
}

提前致谢

2 个答案:

答案 0 :(得分:0)

你可以创建一个'路由器'处理通知有效负载的对象,并将该对象从ViewController传递给ViewController,逐步构建导航堆栈。

Here is a link to a sample project我说明了这个概念。为了演示,'路由器'是在buildNavigationStack中调用application:application handleOpenURL:之后构建的,但您可以轻松地将其更改为使用application:didReceiveRemoteNotification:fetchCompletionHandler:中收到的userInfo字典。

答案 1 :(得分:0)

为了满足这种需要,我在AppDelegate类中创建一个名为UIViewController的{​​{1}}变量,或者在项目中存在我的Singleton类。

对于每个创建的VC,我在currentViewControllerviewWillAppear内添加以下行:

viewDidAppear

这样,屏幕上显示的VC始终保持在ivar中。

因此,在[(myAppDelegate *)[[UIApplication sharedApplication] delegate] setCurrentViewController:self]; 或您提出- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo的任何地方,您都可以轻松呈现或推送您的新VC。

alertViewController

详细解决方案 在这种方法中,关键和棘手的部分是在单个类中设置[self.currentViewController presentViewController:vc animated:YES completion:nil]; 。休息将非常直接。

创建Singleton类:

currentViewController
//CapsHelper.h
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface CAPSHelper : NSObject
{

}

@property (nonatomic, strong) UIViewController * currentViewController;

+ (instancetype)sharedHelpers;

假设您的应用中有大约10个视图控制器,名为//CapsHelper.m #import "CAPSHelper.h" @interface CAPSHelper () @end @implementation CAPSHelper @synthesize currentViewController; #pragma mark Singleton Methods + (instancetype) sharedHelpers { static CAPSHelper *sharedMyManager = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ sharedMyManager = [[self alloc] init]; }); return sharedMyManager; } VC1,..,VC2等。在每个VC中VC10

viewWillAppear:animated:

或者,如果这似乎有很多重复,你可以创建一个新类并覆盖- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [[CAPSHelper sharedHelpers] setCurrentViewController:self] } ,并且你不会在尝试记住将上面添加到你将在未来创建的新VC中时遇到麻烦。

此时我们都已设置好,每次将VC呈现给屏幕时,我们都会将其保存在名为viewWillAppear:animated:的变量中,并且可以通过导入currentViewController <从任何位置访问它/ p>

#import "CAPSHelper.h"