0

我有一個viewController X(不是初始視圖)。 X是幾個父母的一個childViewController(幾個viewController有X作爲他們的孩子)。在X上,有一個標籤,表格和一個導航欄,帶有一個左側欄按鈕,可以「彈出」回到其父項。當應用程序正常啓動時,所有的細節,popToParentViewController,後退按鈕都可以正常工作。但是,如果我要從推送通知啓動應用程序,則X僅顯示導航欄和按鈕(但不起作用)和表視圖。從推送通知啓動時啓動viewController中的所有對象

我不知道爲什麼標籤沒有顯示!後退按鈕不會「返回」。我知道這與「無父母」有關,因爲我已將其設置爲下的以下的「根」。

我該如何實現我想要的代碼?

以下是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字典以檢查是否由於通知而打開了該應用程序。在這種啓動方法就可以訪問該通知的對象是這樣的:

- (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; 
} 

方法- (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo將被稱爲ONLY如果應用程序已經啓動。它可以在應用程序從後臺切換到前臺或運行時調用。當應用程序作爲新進程啓動時,此方法從不被調用。

2

你需要確保你創建你的根和目標視圖控制器之間的所有視圖控制器,並把他們壓入堆棧,在一個單致電[nav setViewControllers:animated:]或多次致電[nav pushViewController:animated:]無論哪種情況,您都可能需要確保動畫參數爲false。

我認爲你還需要確保當你收到通知時你不是已經不方便了,因爲做所有的迴轉可能會讓用戶感到困惑。

+0

Multiple pushViewController:animated:calls是有風險的,因爲UINavigationController在另一個動畫推/拉操作過程中拉動或推動某些東西時會出現令人討厭的毛刺。使用setViewControllers會更好:動畫: –

+0

我怎麼在appDelegate中做到這一點? @MaksymilianWojakowski我不認爲self.window setViewControllers:動畫作品 – user3178926

相關問題