我有針對性爲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];
}
}
}
導航控制器我呈遞模式,並且其根視圖控制器是設置此手勢識別器的人,在層次結構中顯示更多視圖。當只有根視圖控制器被推到導航控制器堆棧上,並且在其外部使用輕擊手勢時,它被正確解除,並且我能夠再次以模態方式呈現該根視圖控制器。當我從根視圖控制器導航並將另一個視圖控制器推入導航堆棧時,輕擊手勢仍然有效,但是當我嘗試再次顯示錶單時應用程序崩潰。
我應該如何處理這個手勢和我想要的導航層次結構的行爲?
在此先感謝
我剛剛嘗試過,它似乎不是(僅)因爲這個......也許我在這種情況下令人困惑的手勢識別器行爲:我只設置了一個「UITapGestureRecognizer」及其動作目標在層次結構的根視圖控制器中,我認爲,因爲我想要檢測的是在當前呈現的視圖之外輕敲,這將工作,但是......我應該在其他視圖控制器中設置手勢識別器層次? – AppsDev
@AppsDev,是的,你正在使用self,view.window也是你的方法,所以這也是一個問題。您可能必須在每個控制器中添加並刪除它,因爲您也參考了self.view。 – rdelmar