2012-12-27 56 views
2

我的問題可能是技術之一,而不是誤解控制器和代表如何設置。也就是說,也許我應該做所有不同的方式......設置navigationController的rootViewController作爲委託

無論如何,我有一個故事板設置與mainViewController。其中有一個UIButton,當點擊時,它會延續到popover。 popover的內容視圖控制器是UINavigationController,他的rootViewControllerMyViewController

我試圖讓mainViewControllerMyViewController一個delegate和我在prepareForSegue這樣做:

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:(@"popSleepSegue")] || [segue.identifier isEqualToString:(@"popAlarmSegue")]) 
    { 
     UIStoryboardPopoverSegue *popSegue = (UIStoryboardPopoverSegue *)segue; 
     popSegue.popoverController.delegate = self; 
     popSegue.popoverController.passthroughViews = [NSArray arrayWithObject:self.view]; 
     if ([segue.identifier isEqualToString:@"popAlarmSegue"]) 
     { 
      if ([[segue destinationViewController] isKindOfClass:[UINavigationController class]]) 
      { 
       UINavigationController *uNC = (UINavigationController *)[segue destinationViewController]; 
       MyViewController *aVC = (MyViewController *)uNC.topViewController; 
       aVC.popController = popSegue.popoverController; 
       aVC.delegate = self; 
      } 
     } 
    } 
} 

[self.delegate class]是在NSLogMyViewController負載上來爲null。當然,在mainViewController中沒有收到delegate回調。

本質上,我試圖模仿蘋果日曆應用程序在iPad上的行爲。

我試圖使用代表傳遞數據上游按成語。訣竅是我試圖通過作爲popover的內容視圖的UINavigationController來設置delegate。聽起來太複雜了。也許還有另一個成語?

與此同時,我要給NSNotificationCenter一個旋風。

+0

奇怪的是,當我得到'null'這裏:'[self.delegate類]'在MyViewController的viewDidLoad回調實際上得到觸發。奇怪。 –

+0

我剛剛在MyViewController中創建了一個測試變量:'@property(nonatomic,strong)NSString * testString;'並試圖在segue中設置它並在MyViewController的視圖中加載打印出來。沒有工作。我的猜測是MyViewController在segue時並不存在 - 即唯一存在的UINavigationController(即目標視圖控制器)。嗯。 –

+0

親切善良 - 如果我在調用委託協議之前將[self.delegate類](和testString)的NSLog打印輸出從viewDidLoad移動到正確之前,那麼它們的確可以正確打印出來,表明委託(和testString)確實在prepareForSegue中。有任何想法嗎?在_after_ viewDidLoad之前@properties沒有設置? –

回答

1

你有潛在的「如果」語句這不可能是真的:

if ([segue.identifier isEqualToString:@"popAlarmSegue"]) 
     { 
      if ([[segue destinationViewController] isKindOfClass:[UINavigationController class]]) 
      { 

從你的代碼的樣子,你應該得到的控制器在酥料餅的內容控制器裏面鑽,而不是目標的viewController從segue。看起來第二個'如果'不是真的。

您需要添加:

  if ([[popSegue.popoverController contentViewController] isKindOfClass:[UINavigationController class]]) 
      { 
       UINavigationController *uNC = (UINavigationController *)popSegue.popoverController; 
       MyViewController *aVC = (MyViewController *)uNC.topViewController; 
       aVC.popController = popSegue.popoverController; 
       aVC.delegate = self; 
      } 
+0

爲什麼這兩個'if'陳述不成立?一個是談論segue的標識符,另一個是談論目標視圖控制器的類?這是兩件獨立的事情。僅供參考,實際上,我不需要第二個,因爲我知道它必須是UINavigationController,但我正在檢查徹底性。 –

+0

我應該提到,如果我使用您的代碼或我的代碼,我會得到相同的結果。我看到使用'contentViewController'背後的邏輯,但由於某種原因,它沒有改變任何東西。 –

+0

另外,如果你看看我對這個問題的評論,如果我等到viewDidLoad在NSLogging之前完成,我會得到預期的結果。 –