解除模态视图但保留数据

时间:2017-02-13 21:41:14

标签: ios swift uitableview core-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表视图:

class AddProductController: UIViewController, ProductControllerDelegate {

override func viewDidDisappear(_ animated: Bool) {
    // error on this line
    getData(sender: productController)
}

2 个答案:

答案 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)
        }
    }

see apple documentation

这里编辑是一种在没有故事板的情况下从代码中触发和解除的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