0

我有針對性爲iPad一個觀點,即我與modalPresentationStyle屬性集模態呈現給UIModalPresentationFormSheet,通過推動首先其視圖控制器到導航控制器:iOS應用崩潰

UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:myViewController]; 
    navController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 
    navController.modalPresentationStyle = UIModalPresentationFormSheet; 
    [self presentViewController:navController animated:YES completion:nil]; 

然後,在呈現視圖控制器,我想檢測自身之外抽頭手勢(如我說,我提出它作爲一個形式片),所以我已經設置一個敲擊手勢這種方式:

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 

    self.tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self 
                     action:@selector(handleTap:)]; 

    self.tapGestureRecognizer.numberOfTouchesRequired = 1; 
    self.tapGestureRecognizer.numberOfTapsRequired = 1; 
    self.tapGestureRecognizer.cancelsTouchesInView = NO; 
    [self.view.window addGestureRecognizer:self.tapGestureRecognizer]; 
} 

- (void)handleTap:(UITapGestureRecognizer*)sender 
{ 
    if (sender.state == UIGestureRecognizerStateEnded) { 
     CGPoint location = [sender locationInView:nil]; 

     if (![self.view pointInside:[self.view convertPoint:location fromView:self.view.window] withEvent:nil]) { 
     [self.view.window removeGestureRecognizer:sender]; 
     [self dismissModalViewControllerAnimated:YES]; 
     } 
    } 
} 

導航控制器我呈遞模式,並且其根視圖控制器是設置此手勢識別器的人,在層次結構中顯示更多視圖。當只有根視圖控制器被推到導航控制器堆棧上,並且在其外部使用輕擊手勢時,它被正確解除,並且我能夠再次以模態方式呈現該根視圖控制器。當我從根視圖控制器導航並將另一個視圖控制器推入導航堆棧時,輕擊手勢仍然有效,但是當我嘗試再次顯示錶單時應用程序崩潰。

我應該如何處理這個手勢和我想要的導航層次結構的行爲?

在此先感謝

回答

0

我認爲你的問題是消除與self.view.window手勢識別 - 當另一個控制器壓入堆棧,因爲只有在屏幕上查看具有非那將是零-nil窗口屬性。嘗試用[UIApplication sharedApplication] .delegate.window替換它,看看是否解決了這個問題。

+0

我剛剛嘗試過,它似乎不是(僅)因爲這個......也許我在這種情況下令人困惑的手勢識別器行爲:我只設置了一個「UITapGestureRecognizer」及其動作目標在層次結構的根視圖控制器中,我認爲,因爲我想要檢測的是在當前呈現的視圖之外輕敲,這將工作,但是......我應該在其他視圖控制器中設置手勢識別器層次? – AppsDev

+0

@AppsDev,是的,你正在使用self,view.window也是你的方法,所以這也是一個問題。您可能必須在每個控制器中添加並刪除它,因爲您也參考了self.view。 – rdelmar

0

我遇到的崩潰的一個可能的原因是忘記將其視圖控制器聲明爲父控制器的childViewController。