我想在收到推送通知并且用户点击该通知时显示特定的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;
}
提前致谢
答案 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,我在currentViewController
和viewWillAppear
内添加以下行:
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"