2015-03-31 60 views
0

我是我應用程序的主導航控制器的UINavigationControllerDelegate。我想知道我的導航控制器顯示的視圖控制器何時會更改以及何時更改。我目前使用這些委託方法找出:檢測導航控制器內容更改,但忽略隱藏/顯示導航控制器本身

// Called when the navigation controller shows a new top view controller via a push, pop or setting of the view controller stack. 
optional func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) 
optional func navigationController(navigationController: UINavigationController, didShowViewController viewController: UIViewController, animated: Bool) 

不幸的是,導航控制器包含着一個滑出式菜單視圖控制器。菜單控制器調用主視圖控制器上的外觀轉換方法,以便在顯示菜單時收到viewWillDisappear,並在菜單被隱藏時收到viewWillAppear/viewDidAppear。包含在導航控制器中的視圖依賴於這些事件來了解它們何時可見。

viewWillAppear在導航控制器本身發生火災時,它會對我調用navigationController:willShowViewController:。當導航控制器上的viewDidAppear發生火災時,它會呼叫navigationController:didShowViewController:

有什麼辦法可以區分我的導航控制器呈現不同的內容視圖控制器和導航控制器本身顯示?

+0

代表是什麼對象?它是一個控制器,如果是,它適合視圖控制器層次結構? – rdelmar 2015-03-31 19:34:20

+0

@rdelmar這是管理一些全局狀態的AppDelegate。 – s4y 2015-03-31 19:58:24

回答

0

我想你可以通過繼承導航控制器,並添加您在viewWillAppear中設置一個布爾屬性來完成此,

-(void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    self.willBeAppearing = YES; 
} 

在委託,檢查此屬性,並在didShowViewController設置爲NO :方法,如果它當前是,

-(void)navigationController:(RDNavController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { 
    if (navigationController.willBeAppearing == NO) { 
     NSLog(@"The controller is changing"); 
     // Do what you need to do when a new controller is about to appear 
    } 
} 


-(void)navigationController:(RDNavController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated { 
    if (navigationController.willBeAppearing == NO) { 
     NSLog(@"The controller has changed"); 
     // Do what you need to do when a new controller has appeared 
    }else{ 
     navigationController.willBeAppearing = NO; 
    } 
} 

請注意,我已將委派方法中傳入的導航控制器的類更改爲我的自定義類。

+0

我希望有一個非hacky的解決方案,但可能沒有一個。看起來像一個足夠合理的解決方法! – s4y 2015-04-01 16:12:30