簡體   English   中英

PresentingViewController如何收到有關其PresentedViewController已關閉的通知?

[英]How can a PresentingViewController get notified that its PresentedViewController dismissed itself?

鑒於:

  • 呈現ViewController B的ViewController A
  • ViewController B 沒有對ViewController A的引用 (隱式表示presentingViewController屬性除外)
  • 視圖控制器B調用dismiss本身並沒有別的

我要實現的目標:

  • ViewController A想知道ViewController B何時被解雇以清理某些狀態

限制:

  • 我不想使用KVO
  • 我不想以任何方式修改ViewController B或其行為

到目前為止,我發現了什么:

  • 根據文檔的 dismiss(animated:completion:)將調用轉發到其presentingViewController 但是看起來好像調用dismiss(animated:completion:) ,而是私有方法_performCoordinatedPresentOrDismiss:animated:
  • 有關presentingViewController iOS 文檔具有誤導性。 它說“呈現的視圖控制器已將此屬性設置為呈現它的視圖控制器”,但事實並非如此。 在iOS系統中11,這將始終指向根父VC的VC是present被稱為上。 同樣presentedViewController文檔具有誤導性。 它說“調用該方法的視圖控制器已將此屬性設置為它所提供的視圖控制器”,但這還不是全部。 調用present的VC層次結構中的每個VC(所有其父VC和子VC)都將指向同一個presentedViewController

在您的Controller A中,將其navigationController:didShowViewControllerUINavigationControllerDelegate並使用navigationController:didShowViewController標記控制器B的表示形式( isControllerBisPresented = true )。 當B的viewDidAppear時,檢查isControllerBisPresented是否為true。

一個丑陋的解決方法是使用在deinit中執行某些操作的deinit 所以, A呈現M中嵌入B作為childVC。 B自行解散時, M也將隱式解散,因此調用它的deinit方法。 在那里,它可以通知A被解雇。

這是脆弱的,因為某個參考周期可能阻止M的重新分配,這將導致A無法得到通知。 所以我寧願找到一個更好的解決方案。

暫無
暫無

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

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