在項目開發過程中,我遇到這樣的一個問題:架構是tabViewController+NavigationViewController,在一個子控制器中我需要一個alertview點擊后響應[self.navigationControllerpopToViewController:[self.navigationController.viewControllersobjectAtIndex:i]animated:YES];
結果報錯:reason: '-[_UIAlertShimPresentingViewController setHide:]: unrecognized selector sent to instance 0x146dfeb0'
從報錯的信息來看是_UIAlertShimPresentingViewController沒有定義setHide函數,而我的setHide函數是定義在我的tabViewController里的,
后來追溯原因發現是因為我的子控制用到了以下兩個函數(用來控制自定義的tabbar是否顯示)
-(void)viewWillAppear:(BOOL)animated
{
tabViewController*tabbarcontroller = (tabViewController*)[UIApplicationsharedApplication].keyWindow.rootViewController;
[tabbarcontrollersetMyHide:YES];
}
-(void)viewWillDisappear:(BOOL)animated
{
tabViewController*tabbarcontroller = (tabViewController*)[UIApplicationsharedApplication].keyWindow.rootViewController;
[tabbarcontrollersetMyHide:NO];
}
后來發現先彈出了個alertview,再去使用keywindow,此時的keywindow.rootviewcontroller就是UIAlertShimPresentingViewController,因此無法執行setHide函數。
我的解決方案時不使用[UIApplicationsharedApplication].keyWindow.rootViewController去獲取根視圖,通過
self.view.window.rootViewController去獲取根視圖。
代碼如下:
-(void)viewWillAppear:(BOOL)animated
{
tabViewController*tabbarcontroller = (tabViewController*)[UIApplicationsharedApplication].keyWindow.rootViewController;
[tabbarcontrollersetMyHide:YES];
}
-(void)viewWillDisappear:(BOOL)animated
{
tabViewController*tabbarcontroller = (tabViewController*)self.view.window.rootViewController;
[tabbarcontrollersetMyHide:NO];
}