首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

iOS Storyboard 導航:Push A→B,Present C,再返回 A 的實現

     編輯:程式設計綜合問答

導航棧關係

NavigationController (root: A)
    └─ push → B
          └─ present → C (modal)

目標:在 C 點選按鈕,**關閉 C 並回到 A**(B 也要移除)。

實現步驟

  1. C 控制器 定義一個 delegate 協議或 **Closure/Block** 回調,或發送 NotificationCenter 通知。
  2. C 點選返回按鈕時:
    dismiss(animated: true) { /* completion */ } 先關閉自己。
  3. 在 dismiss 的 completion 或通知觀察者中,讓 **NavigationController** 執行 popToRootViewController(animated: true)(回到 A)。

代碼範例 (Swift)

// CViewController
protocol CDelegate: AnyObject { func cDidRequestReturnToRoot() }
weak var delegate: CDelegate?

@IBAction func backToA(_ sender: UIButton) {
    dismiss(animated: true) {
        self.delegate?.cDidRequestReturnToRoot()
    }
}

// BViewController (或 AViewController) 符合協議並設為 C 的 delegate
func cDidRequestReturnToRoot() {
    navigationController?.popToRootViewController(animated: true)
}

// 或用 NotificationCenter (無需 delegate 耦合)
// C: NotificationCenter.default.post(name: .returnToRoot, object: nil)
// A/B: 觀察 .returnToRoot 執行 popToRootViewController

關鍵點

  • 先 dismiss C,再 pop 到根,動畫順暢且導航棧乾淨。
  • 若 B 也需移除,popToRootViewController 會一次彈出所有 push 進來的控制器。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved