簡體   English   中英

Swift:解除模態后在ViewController上執行一個函數

[英]Swift: Perform a function on ViewController after dismissing modal

用戶在視圖控制器中調用模態。 當在模態上調用self.dismissViewController時,需要在初始視圖控制器上運行函數。 此函數還需要從模態傳遞的變量。

此模式可以從多個視圖控制器中顯示,因此無法在模態視圖的viewDidDisappear中直接調用該函數。

怎么能迅速完成?

delegate怎么樣?

或者您可以像這樣制作一個ViewController

typealias Action = (x: AnyObject) -> () // replace AnyObject to what you need
class ViewController: UIViewController {
  func modalAction() -> Action {
    return { [unowned self] x in 
      // the x is what you want to passed by the modal viewcontroller
      // now you got it
    }
  }
}

在模態中:

class ModalViewController: UIViewController {
  var callbackAction: Action?
   override func viewDidDisappear(_ animated: Bool) {
    let x = … // the x is what you pass to ViewController
    callbackAction?(x)
  }
}

當然,當你顯示ModalViewController需要像ViewController這個modal.callbackAction = modalAction()一樣設置callbackAction

提問者(Michael Voccola)提供和選擇的答案對我不起作用,所以我想提供另一個答案選項。 他的回答對我不起作用,因為當我解除模態視圖時,viewDidAppear似乎沒有運行。

我有一個表和一個模態VC出現並采取一些表輸入。 我發送初始VC模態的新變量信息沒有問題。 但是,在解除模態視圖時,我無法讓表自動運行tableView.reloadData函數。

對我有用的答案在上面的評論中:

您可能希望使用模式上的展開segue來執行此操作,這樣您就可以在展開時調用父函數。 stackoverflow.com/questions/12561735 / ... - porglezomp於2014年12月15日3:41

如果您只需要展開一步(VC2到VC1),您只需要一個給定答案的片段:

第1步:在VC1代碼中插入方法

執行展開segue時,需要指定一個動作,該動作是要放松到的視圖控制器的動作方法:

@IBAction func unwindToThisViewController(segue: UIStoryboardSegue) {
    //Insert function to be run upon dismiss of VC2
}

步驟2:在故事板中,在顯示的VC2中,從按鈕拖動到退出圖標並選擇“unwindToThisViewController”

添加操作方法后,您可以通過控制拖動到“退出”圖標來定義故事板中的展開segue。

就是這樣。 這兩個步驟對我有用。 現在當我的模態視圖被解雇時,我的表格會更新。 剛想我會添加這個,以防其他人的問題沒有被所選答案解決。

通過將全局變量設置為模態視圖控制器的布爾值,我能夠實現所需的結果。 該變量是從一個單獨的類中的結構啟動並可用的。

當模態被解除時,初始視圖控制器上的viewDidAppear方法相應地響應全局變量的值,並且如果需要,則翻轉全局變量上的值。

從性能角度來看,我不確定這是否是最有效的方法,但它在我的場景中完美運行。

暫無
暫無

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

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