0

viewController X (초기보기가 아님)가 있습니다. X는 여러 부모의 childViewController입니다 (여러 viewController는 X가 자식으로 있습니다.) X에는 레이블, 테이블 및 탐색 막대가 있으며 왼쪽 막대 버튼이 부모로 팝업됩니다. 앱이 정상적으로 시작되면 모든 segues, popToParentViewController, 뒤로 버튼이 제대로 작동합니다. 그러나 푸시 알림에서 앱을 시작하는 경우 X는 탐색 모음 및 버튼 (기능하지 않음)과 표보기만으로 나타납니다.푸시 알림에서 시작할 때 viewController의 모든 객체 초기화

레이블이 표시되지 않는 이유를 모르겠습니다. 뒤로 버튼이 "뒤로"이동하지 않습니다. 나는 그것이 "no parent"와 관련이있다는 것을 알고있다. 왜냐하면 나는 코드 아래의 아래에 "루트"로 설정했기 때문이다.

코드로 원하는 것을 어떻게 구현할 수 있습니까? 다음

는 appDelegate.m에

- (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 
{ 
    if (application.applicationState == UIApplicationStateInactive || application.applicationState == UIApplicationStateBackground ) 
{ 

    UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" 
                  bundle: nil]; 
    NotificationsViewController *viewController= [mainStoryboard instantiateViewControllerWithIdentifier:@"NotificationsViewController"]; 
    UINavigationController *nav = [[UINavigationController alloc] 
            initWithRootViewController:viewController]; 
    [_window setRootViewController:nav]; 
} 
} 

답변

1

우선 응용 프로그램은 항상 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 메서드로 시작됩니다. launchOptions 사전을 검토하여 알림으로 인해 앱이 열렸는지 확인해야합니다. 응용 프로그램이 이미 실행 된 경우 - (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 호출됩니다

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions; 
{ 
    // setup navigation controller here, I assume you already have this in your code 

    NSDictionary *dictionary = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; 

    if (dictionary != nil) 
    { 
     NSLog(@"%@: did launch with notification: %@", [self class], dictionary); 

     // put the navigation controllers on the nav controller stack as David described 
    } 
    [[self window] setRootViewController:navigationController]; 
    [self.window makeKeyAndVisible]; 

    return YES; 
} 

에있어서 그 실행 방법에서는 통지 대상이 방법에 액세스 할 수 있습니다. 앱이 백그라운드에서 포 그라운드로 전환되거나 실행될 때 호출 될 수 있습니다. 응용 프로그램이 새 프로세스로 시작될 때이 메서드는 호출되지 않습니다.

2

당신은 하나에 하나, 당신이 당신의 루트 및 대상 뷰 컨트롤러 사이의 모든 뷰 컨트롤러를 만들 수 있는지 확인하고 스택에 그들을 밀어해야합니다 [nav setViewControllers:animated:]을 호출하거나 [nav pushViewController:animated:]을 여러 번 호출하십시오. 어느 경우 든 애니메이션 매개 변수가 false인지 확인하고 싶을 것입니다.

알림을받을 때 사용자가 이미 혼란스러워 할 수 있으므로 모든 알림을받을 때 이미 불편하지 않았는지 확인하고 싶을 것입니다.

+0

여러 푸시 뷰 컨트롤러 : 애니메이션 : 다른 애니메이션 푸시/풀 작업 중에 무언가를 당기거나 밀 때 UINavigationController가 이상한 글리치를 가지고 있기 때문에 위험합니다. setViewController를 사용하는 것이 훨씬 더 좋습니다. 애니메이션 : –

+0

appDelegate에서 어떻게 할 수 있습니까? @MaksymilianWojakowski 나는 자기를 생각하지 않는다 .window setViewControllerers : animated works – user3178926