[英]Dismissing a modal view but keeping the data
我試圖關閉模式視圖,然后返回到“發送”的視圖控制器,同時保留在模式視圖中輸入的數據。 如果我理解正確,則需要為此使用委托/協議,但在理解如何在這種情況下實際實施時會遇到很多麻煩。
基本上,用戶可以調用模式視圖以在文本字段中輸入一些信息,然后在單擊保存時調用此函數:
func handleSave() {
guard let newProductUrl = NSURL(string: urlTextField.text!) else {
print("error getting text from product url field")
return
}
guard let newProductName = self.nameTextField.text else {
print("error getting text from product name field")
return
}
guard let newProductImage = self.logoTextField.text else {
print("error getting text from product logo field")
return
}
// Call save function in view controller to save new product to core data
self.productController?.save(name: newProductName, url: newProductUrl as URL, image: newProductImage)
// Present reloaded view controller with new product added
let cc = UINavigationController()
let pController = ProductController()
productController = pController
cc.viewControllers = [pController]
present(cc, animated: true, completion: nil)
}
哪個調用self.productController?.save
函數將新輸入的值保存到核心數據中,並使用新產品重新加載productController
表視圖。
但是,我遇到的問題是productController
表視圖是根據其他因素動態設置的,因此我只想在用戶輸入數據后關閉模式視圖,然后將模式視圖返回頁面被叫。
編輯:嘗試了解如何實現委托-
ProductController是用戶從以下位置進入模式視圖的父類:
protocol ProductControllerDelegate: class {
func getData(sender: ProductController)
}
class ProductController: UITableViewController, NSFetchedResultsControllerDelegate, WKNavigationDelegate {
override func viewDidLoad() {
super.viewDidLoad()
weak var delegate:ProductControllerDelegate?
}
func getData(sender: ProductController) {
}
並且AddProductController是模態呈現的控制器,用戶在其中輸入數據,然后handleSave
,我想關閉並返回到它從以下位置調用的ProductController handleSave
:
class AddProductController: UIViewController, ProductControllerDelegate {
override func viewDidDisappear(_ animated: Bool) {
// error on this line
getData(sender: productController)
}
如果協議的唯一目的是返回視圖控制器的最終狀態,則通常更輕松,更清晰地使用展開順序而不是協議。
腳步:
1)在父VC中,使@IBAction展開(segue:UIStoryboardSegue)方法
2)在顯示的ViewController的情節提要中,您可以控制從想要觸發出口的控件或黃色視圖控制器本身(如果執行代碼中的segue)的拖動到橙色出口圖標。
您的代碼應如下所示:
@IBAction func unwind(segue: UIStoryboardSegue) {
if let source = segue.source as? MyModalViewController {
mydata = source.data
source.dismiss(animated: true, completion: nil)
}
}
在這里進行編輯是一種無需腳本即可觸發代碼和從代碼中解脫出來的簡單方法; 我不贊成這樣做:
guard let navigationController = navigationController,
let presenter = navigationController.viewControllers[navigationController.viewControllers.count - 2] as? MyParentViewController else {
return
}
presenter.unwind(UIStoryboardSegue(identifier: String(describing: self), source: self, destination: presenter))
基本上,您需要在此模式視圖中創建一個委托。 假設您有創建此模態視圖控制器的ParentViewController。 ParentViewController必須實現委托方法,例如retrieveData(someData)。
在模態視圖控制器上,可以使用方法viewWillDisappear()觸發委托方法,該委托方法要將數據傳遞給父方法:
proxy.retrieveData(someData)
如果您在理解如何實現委托方面遇到問題,可以檢查此鏈接
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.