0

我有一個UINavigationController,在其中使用UIModalPresentationPageSheet演示樣式推送視圖控制器。Objective-C - 同時關閉表單和頁表

在本頁面的視圖控制器中,我使用UIModalPresentationFormSheet風格呈現視圖控制器。

當用戶點擊完成按鈕表單時,我想關閉表單和頁面表單。

在完成按鈕的操作:

-(IBAction)onDone:(id)sender 
{ 
    if(self->delegate && [self->delegate respondsToSelector:self->actionSelector]) 
    { 
    [self->delegate performSelector:self->actionSelector withObject:[NSString stringWithString:self.textView.text]]; 
    } 

    [self dismissViewControllerAnimated:YES completion:nil]; 
} 

的委託是頁片的視圖控制器,而在選擇器,我關閉該頁面片:

[self dismissViewControllerAnimated:YES completion:nil]; 

當我運行它,我得到:

Warning: Attempt to dismiss from view controller <UINavigationController: 0xa9381d0> while a presentation or dismiss is in progress! 

我能看到爲什麼會這樣 - 因爲選擇之前被叫表單視圖已被駁回,但我不知道解決此問題的最佳方法。

我已經嘗試刪除onDone中的解僱,並呼籲在選擇器調用解僱(與動畫:NO的表單),它似乎功能,但我不知道這是否是這樣我應該處理它。

回答

1

請嘗試調用dismissViewControllerAnimated:completion:在頁面上。根據Apple的文檔:

「如果您連續顯示多個視圖控制器,從而構建一堆呈現的視圖控制器,則在視圖控制器上調用此方法時,視圖控制器將取消它的直接子視圖控制器和所有視圖控制器當這種情況發生時,只有最頂層的視圖纔會以動畫的方式被解散;任何中間視圖控制器都會從堆棧中移除,最頂層的視圖會使用其模式轉換樣式來解散,這可能會有所不同從堆棧中較低位置的其他視圖控制器使用的樣式「。

如果這不是正是你想要的行爲,那麼你應該使用dismissViewControllerAnimated完成處理器的說法:完成:在一個塊通過,則拒絕來自完成處理其他視圖控制器,例如:

[formSheetViewController dismissViewControllerAnimated:YES completion:^{ 
    [pageSheetViewController dismissViewControllerAnimated:YES competion:nil]; 
} 

雖然真的,我認爲只是解僱頁面應該爲你做的伎倆。理解完成處理程序的工作方式仍然很好。它可以讓你在手術完成後做一些工作 - 非常方便。