簡體   English   中英

Swift:關閉 ViewController2 后從 ViewController1 調用方法

[英]Swift: Call a method from ViewController1 after dismissing ViewController2

我目前正在構建一個家庭作業跟蹤應用程序,您可以在其中在 TableView 中添加課程。 在一個 ViewController 中,我有一個已經存在的課程列表。 我還有一個按鈕,允許用戶添加新課程。 當他們單擊按鈕時,應用程序會觸發模態搜索到新的 ViewController,他們可以在其中填寫表單以添加新課程。 但是,當他們完成並單擊將當前 ViewController 關閉到 go 的按鈕返回課程列表時,我找不到使用用戶剛剛添加的課程更新課程列表的方法。 我知道如果使用 segue,您可以使用 prepare 方法。 不過我打電話

 dismiss(animated: true, completion: nil)

我要調用以重新加載表的方法位於第一個 ViewController 中。 有沒有辦法在第二個 ViewController 關閉之前或之后調用第一個 ViewController 中的 load 方法?

根據您的要求,一個簡單的“委托”將起作用。

第 1 步:定義協議。

protocol ViewController2Delegate: class {
func refresh()
}

Step2:在 ViewController2 創建一個委托

weak var delegation: ViewController2Delegate?

步驟 3:當您使用按鈕中的“segue”從 ViewController1 創建 ViewController2 時,使用 ViewController1 中的prepareForSegue方法並設置 ViewController1 符合委托。 ViewController1 將符合委托並重新加載表。

第4步:在ViewController2中,點擊doneButton,根據您的要求調用delegate?.refresh() (在關閉viewcontroller2之前/關閉viewcontroller2之后-使用dismiss()方法的completionBlock)。

您可以在第一個視圖 controller 中使用 viewWillappear function 來刷新或僅使用完成處理程序如下:

1) 在第二個 controller 添加這個變量。

var completion: (() -> Void)?

2) 在第一個 controller 顯示第二個 controller 之前,您需要添加此代碼。

let controller = secondController()
controller.completion = {
  // here you can refresh your first controller
}

3)在此處進行刷新是您在調用駁回 function 之前需要在第二個 controller 中執行的最后一步。

if let completion = completion{
  completion()
}

您可以在 ViewController1 上的 viewWillAppear 中調用 reloadData

override func viewWillAppear(_ animated: Bool) {
        tableview.reloadData() 
}

您可以在FirstViewControllerviewWillAppear上執行loadDatarefreshData ,如下所示:

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

    refresData()
}

FirstViewControllerviewWillAppear將在您調用以從SecondViewController中關閉后立即調用。

您可以在第二個視圖 controller 中為第一個 controller 使用委托,並在調用解雇之前調用它。 如果要在dismiss后運行,那么可以在dismiss完成后調用它function。

暫無
暫無

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

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