簡體   English   中英

退出模態視圖控制器堆棧

[英]Dismissing modal view controller stack

給定以下視圖控制器布局。

查看控制器布局

我們建立通過第一呈現的疊層模態視圖控制器的BA然后呈遞CB 根據Apple關於dismiss(animated:completion:)文檔 ,在A上調用它實際上應該以動畫方式關閉最頂層的視圖控制器(在這種情況下為C ),而所有中間視圖控制器都沒有動畫。 但是,發生的情況是C被無動畫地解雇了,而B被動畫化了。

在GitHub上建立了一個Xcode項目來復制這種行為。 我遺漏了一些東西還是誤解了這里的文檔?

在網上瀏覽並嘗試各種“解決方案”后,很明顯這是iOS中的實際錯誤。 它自iOS 8以來一直存在...並一直存在於iOS 10中。最初是在iOS 8中報告的,但是該解決方案從未得到驗證,並且由於不活動,Apple自動關閉了雷達。

我提交了新的雷達,因為這與dismissViewController的文檔直接矛盾

如果您連續顯示幾個視圖控制器,從而構建一個呈現的視圖控制器堆棧,則在堆棧中較低的視圖控制器上調用此方法(意味着-[UIViewController dismissViewControllerAnimated:completion]),則將其直接子視圖控制器以及上面的所有視圖控制器都關閉那個孩子在棧上。 發生這種情況時,只有最上面的視圖會以動畫方式關閉; 只需從堆棧中刪除所有中間視圖控制器即可。

清晰可視化問題,包括預期結果和實際結果。 感謝Boris Survorov提供的測試項目和可視化效果。

預期成績 實際結果iOS 8+

我遇到了同樣的問題,這是我發現的可行解決方法。 需要關閉整個堆棧時,請在A中執行以下代碼:

viewControllerB.view.isHidden = true
viewControllerC.dismiss(animated: true) // or viewControllerB.dismiss(animated:true) - it should produce the same result: dismiss viewControllerC
dismiss(animated: false) // dismisses viewControllerB

這應該導致預期的行為。

我猜您從A到B的選擇也是模態的? 在這種情況下,從A調用的dismiss函數想要關閉視圖,該視圖緊接在A的頂部,即B。C只是為了顯示B的動畫隱藏而被隱藏。在這種情況下,您不能通過模態搜索,並使用dismiss功能消除最上面的那個,如果您走得很遠的話。 不過,如果從B處調用以關閉C,則該dismiss將按預期工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM