我试图解除模态视图并返回到已发送的视图控制器"来自,同时保留在模态视图中输入的数据。如果我理解正确,我需要使用委托/协议,但我在理解如何在这种情况下实际实现它时遇到很多麻烦。
用户基本上可以调用模态视图在文本字段中输入一些信息,当他们点击保存时,会调用此函数:
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表视图:
class AddProductController: UIViewController, ProductControllerDelegate {
override func viewDidDisappear(_ animated: Bool) {
// error on this line
getData(sender: productController)
}
答案 0 :(得分:1)
如果您的协议的唯一目的是返回视图控制器的最终状态,则通常更容易和更清楚地使用展开segue而不是协议。
步骤:
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)
}
}
这里编辑是一种在没有故事板的情况下从代码中触发和解除的hacky方式;我并不认可这样做:
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))
答案 1 :(得分:0)
基本上你需要在这个模态视图中创建一个委托。 假设你有ParentViewController创建这个模态视图控制器。 ParentViewController必须实现委托方法,假设为retrieveData(someData)。
在模态视图控制器上,您可以使用方法viewWillDisappear()来触发您想要传递给父级的数据的委托方法:
delegate.retrieveData(someData)
如果您在了解如何实施委托时遇到问题,可以查看this link