2017-09-14 45 views
2

我有模態地呈現UINavigationController。在該導航控制器上,推送兩個視圖控制器。按下「完成」按鈕後,應從第二個視圖控制器中取消整個模式演示。要做到這一點,解除被稱爲上presentingViewController在iOS 11中,解散模態呈現的導航控制器會導致視覺重複

@IBAction func doneWasPressed(_ sender: UIBarButtonItem) { 
    presentingViewController!.dismiss(animated: true) 
} 

在iOS系統11中,當導航控制器內的祖先已經呈現出UISearchController,其被添加到navigationItem,駁回導航控制器使一個視覺僞影,由此視圖的副本可見下方的動畫視圖。一旦頂視圖移出視圖,下面的重複圖標突然消失。請參閱下面的gif以獲取問題的屏幕錄像。

this GitHub repository中有一個可重複使用的小例子。它使用Swift 4在Xcode 9(GM)上創建。

是否有已知的解決方法?


+0

你確定這是綁定到完成按鈕的唯一代碼? – ramacode

+0

是的,從故事板我可以驗證只有一個動作發送完成按鈕。完成按鈕也作爲插座存儲,以便在其他情況下可以禁用,但這不應該是相關的。 –

+0

最初如何顯示此視圖控制器?後退箭頭的存在表明這是推動,而不是呈現。 – rmaddy

回答

3

在準備你的minimal, complete, and verifiable example,你注意到的問題是UISearchController的存在。我注意到,即使我推到第二頁視圖控制器(過去與UISearchController視圖控制器),該搜索控制器仍然存在:

search controller still in hierarchy

如果設置isActivefalse當視圖消失,這個問題就消失了。

override func viewDidLoad() { 
    super.viewDidLoad() 

    let searchController = UISearchController(searchResultsController: nil) 
    searchController.obscuresBackgroundDuringPresentation = false 
    searchController.hidesNavigationBarDuringPresentation = false 
    navigationItem.searchController = searchController 
    navigationItem.hidesSearchBarWhenScrolling = false 
} 

override func viewWillDisappear(_ animated: Bool) { 
    super.viewWillDisappear(animated) 

    navigationItem.searchController?.isActive = false 
} 

而且,當這樣做時,解僱按預期工作。


我的原始答案,建議您想關閉導航控制器,而不是呈現視圖控制器,如下。


如果您所呈現的導航控制器模態,然後推從那裏幾個視圖控制器,你不想解僱presentingViewController,而是navigationController,如:

navigationController?.dismiss(animated: true) 

或者,或者,您的視圖控制器上創建一個展開行動要返回:

@IBAction func unwindHome(_ segue: UIStoryboardSegue) { 
    // this is intentionally blank 
} 

然後您可以創建一個展開塞古在興業e右:

enter image description here

或者,如果你必須以編程方式做到這一點,創建視圖控制器和「退出」出口之間的開卷SEGUE,然後你就可以performSegue(withIdentifier:sender:)

+0

感謝您的建議!但是,當我切換到使用展開動作時,我仍然有完全相同的問題! 我注意到,我只看到了這個問題,當在導航控制器的祖先VC有一個'searchController'。我知道這聽起來很瘋狂,但我使用完全相同的VC和沒有問題的另一個故事板辭退方法... 當我執行'navigationController .dismiss(動畫:真)?'中,消失不再有動畫(即使我通過'animated:true'):視圖瞬間消失。 –

+0

讓我修改我以前的評論(我錯過了另一塊代碼解聘的無動畫): 我第一次叫'navigationController .dismiss(動畫:真)?',它_does沒有駁回view_!我必須點擊完成兩次,然後調用我的'doneWasPressed'方法兩次。只有第二次調用'navigationController?.dismiss(animated:true)'纔有效果。 同樣,只有祖先在其導航項中具有searchController的情況也是如此。切換到定位在視圖,而不是一個搜索欄,將刪除這個問題... –

+1

我建議你創建[你的問題的最小可能重複的例子(http://stackoverflow.com/help/mcve),因爲我們可以根據上述信息重現您的問題。創建一個空白項目,並添加您在實際應用中看到的內容,直到出現重現問題的內容。 (一般來說,在創建這個MCVE的過程中,你會自己弄清楚這個問題!) – Rob

相關問題