2017-02-13 60 views
0

我试图解除模态视图并返回到“发送”的视图控制器,同时保留在模态视图中输入的数据。如果我理解正确,我需要为此使用委托人/协议,但是在这种情况下,我很难理解如何实际执行它。解除模态视图但保留数据

基本上是一个用户可以调用模态的视图,进入文本字段的一些信息,而当他们点击保存这个函数被调用:

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的tableview,它被称为:

class AddProductController: UIViewController, ProductControllerDelegate { 

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

回答

0

基本上你需要在这个模态视图中创建一个委托。 假设您有创建此模态视图控制器的ParentViewController。 ParentViewController必须实现委托方法,比方说retrieveData(someData)。

在模态视图控制器,你可以使用的方法viewWillDisappear()触发你想传递给家长该数据的委托方法:

delegate.retrieveData(someData)

如果您在理解如何实现代理时遇到问题,您可以检查this link

+0

谢谢琼我现在正在尝试 - 我应该在父视图控制器(ProductController)或模式控制器(AddProductController)中创建协议? – d0xi45

+0

我想将'handleSave'中收集的数据传递给父级(ProductController),我可以传递一个完整的函数吗?我的印象是'handleSave'将用户输入的数据传递到核心数据,然后ProductController正在从核心数据读取 – d0xi45

+0

@ d0xi45您必须在AddProductController中声明协议,但在ProductController中实现它,请检查我之前发布的链接。我不知道你的意思是传递一个完整的函数,它的工作方式是调用其他函数。 –

1

如果协议的唯一目的是返回视图控制器的最终状态,盟友更容易和更清晰地使用unwind segue而不是协议。

步骤:

1)在母体VC你做出@IBAction退绕(赛格瑞:UIStoryboardSegue)方法

2)在所提出的视图控制器的故事板可以控制从任一所需的控制拖触发退出或从黄色视图控制器本身(如果在代码中执行继续)到橙色退出图标。

你的代码应该是这样的:在这里

@IBAction func unwind(segue: UIStoryboardSegue) { 
     if let source = segue.source as? MyModalViewController { 
      mydata = source.data 
      source.dismiss(animated: true, completion: nil) 
     } 
    } 

see apple documentation

编辑是触发和代码不放松故事板哈克的方式;我不认同这样做:

 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)) 
+0

这是唯一的目的,所以我会尝试这种方式,而不是代表现在,出于某种原因,我发现代表们真的很困惑,因为这个任务看起来很简单..虽然我没有使用故事板,但这是所有程序化。 – d0xi45

+0

你只能用故事板做到这一点。否则,你必须使用hackery。也就是说,您需要对视图控制器的引用,或者从navigationController中抓取它。看代码编辑 –

+0

我认为它可能在Swift 3中有点不同,当我尝试hackery方法时,它想要一个'towardsViewController'参数。我尝试将代码插入正确的语法中,例如'presenter.unwind(for:UIStoryboardSegue(identifier:String(describe:self),source:self,destination:presenter),但是遇到了崩溃 – d0xi45

相关问题