Для этой цели я создаю переменную UIViewController
под названием currentViewController
в классе AppDelegate или моем классе Singleton, если он существует в проекте.
Для каждого VC создано, добавить следующую строку внутри viewWillAppear
и viewDidAppear
:
[(myAppDelegate *)[[UIApplication sharedApplication] delegate] setCurrentViewController:self];
Таким образом, VC показывается на экране всегда находится в Ивар.
Итак, в - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
или где бы вы ни представляли alertViewController
, вы можете легко или легко представить свой новый VC.
[self.currentViewController presentViewController:vc animated:YES completion:nil];
Полное Detail Решение: В этом подходе критическая и сложная часть задающего currentViewController
в одноплодной классе. Отдых будет очень прямолинейным.
Создать Singleton Класс:
//CapsHelper.h
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface CAPSHelper : NSObject
{
}
@property (nonatomic, strong) UIViewController * currentViewController;
+ (instancetype)sharedHelpers;
//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;
}
Допустим, у вас есть около 10 viewcontrollers в приложении под названием VC1
, VC2
, .., VC10
и т.д. В каждом ВК viewWillAppear:animated:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[[CAPSHelper sharedHelpers] setCurrentViewController:self]
}
Или, если это похоже на множество репрессий вы можете создать новый класс и переопределить viewWillAppear:animated:
, и вам не составит труда попытаться вспомнить добавление выше к новым VC, которые вы создадите в будущем.
На данный момент мы все готово, каждый раз, когда ВК будет представлен на экране, мы проводим его в переменной с именем currentViewController
, и она доступна из любой точки планеты, импортируя #import "CAPSHelper.h"
//AppDelegate.m
#import "AppDelegate.h"
#import "CAPSHelper.h"
@interface AppDelegate()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSDictionary *userInfo = [launchOptions valueForKey:@"UIApplicationLaunchOptionsRemoteNotificationKey"];
NSDictionary *apsInfo = [userInfo objectForKey:@"aps"];
if(apsInfo)
{
if([[CAPSHelper sharedHelpers] currentViewController])
{
//UIViewController * pushNotificationViewController = [[UIViewController alloc] ..... This is your specific VC which you want to present when a PN is recieved..
[[[CAPSHelper sharedHelpers] currentViewController] presentViewController:pushNotificationViewController animated:YES completion:nil];
}
}
}
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
NSDictionary *apsInfo = [userInfo objectForKey:@"aps"];
if(apsInfo)
{
if([[CAPSHelper sharedHelpers] currentViewController])
{
//UIViewController * pushNotificationViewController = [[UIViewController alloc] ..... This is your specific VC which you want to present when a PN is recieved..
[[[CAPSHelper sharedHelpers] currentViewController] presentViewController:pushNotificationViewController animated:YES completion:nil];
}
}
}
Уважаемый @ Rufel многие пользователи реализуют это и работают в основном во всех приложениях, которые используют push-уведомления, которые напрямую перенаправляются на другое представление, когда пользовательский клиент на этом уведомлении сообщает, пожалуйста, код ссылки. –
@onestopappsolution: Я не уверен, что понимаю, что вы имеете в виду? – Rufel