2012-05-27 25 views
0

在我的AppDelegate中,我實例化了一個UINavigationController並添加了我的「主」視圖(我們稱之爲MainViewController)作爲導航控制器的根視圖控制器。然後將導航控制器作爲子視圖添加到應用程序委託的窗口,並使窗口可見。即,NSNotification不是由包含在UINavigationController中的子視圖處理的

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    // viewController is a property of the app delegate 
    viewController = [[MainViewController alloc] init]; 
    viewController.context = [self managedObjectContext]; 

    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController]; 

    [self.window addSubview:navController.view]; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

MainViewController增加觀察員用於由視圖控制器的子視圖張貼編程實例化,並加入作爲MainViewController一個子視圖一些NSNotifications。所以,

  • MainViewController(在UINavigationController的)
    • SubViewController
      • 子視圖該職位的通知

一旦我將UINavigationController添加到組合中,MainViewController不再適當地處理子視圖發佈的通知。如果我刪除了UINavigationController,並且只需將MainViewController作爲AppDelegate窗口的子視圖,就可以正確處理通知。

我嘗試添加的觀察員AppDelegate中所張貼的子視圖通知之一,它處理得當,並在處理任何通知,MainViewController不爲零。

任何指導將不勝感激。請讓我知道你是否想要澄清。

回答

0

好了,一對夫婦的事情發生在這裏:

  1. viewController本來就不是我的應用程序委託的屬性。使其成爲財產導致NSNotification被再次處理。
  2. 之後,選擇器中的代碼由NSNotification觸發不能正常工作 - 它應該推入一個新的視圖MainViewController的navigationController,這是零。在UINavigationController的應用程序委託中創建一個屬性也解決了這個問題。
+2

在應用程序委託中擁有navController引用是件好事。但是,您必須能夠通過視圖控制器的「navigationController」屬性訪問navController實例,而不是嚮應用程序委託請求它(如果意外更改了應用程序委託屬性,則可能是不同的navControllers,而任何視圖控制器的navigationController屬性會自動填充),這對於根視圖和推送視圖控制器都是有效的。 –

+0

謝謝,這是一個很好的提示。無論何時將新視圖推入堆棧,我都一直在確保使用self.navigationController,所以還沒有咬我。 –

相關問題