在没有segue和storyboard的popViewController之前传递数据

时间:2017-08-12 17:55:56

标签: ios uiviewcontroller uinavigationcontroller delegates

我有两个视图控制器。主要和临时的。第二个在不同的屏幕上执行操作(由pushViewController调用)然后我弹出(popViewController)并且想要呈现返回的值,即String。

我尝试使用协议,但它没有。

这是我的代码:

SecondVC.swift:

protocol ValueDelegate {
    func append(_ text: String)
}

class SecondViewController: UIViewController{

   var delegate: ValueDelegate!

   ...

   ...
   private func function(){
      if let delegate = self.delegate{
         delegate.append(value.stringValue)
      }
      navigateBack()
   }

   private func navigateBack(){
   if let navigation = self.navigationController{
      navigation.popViewController(aniamted: true)
   }
}

MainVC.swift:

class MainViewController: UIViewController, ValueDelegate {
   var secondVC = SecondViewController()

   ...
    func append(_ value: String) {
        textField.text?.append(barcode)
    }

   ...
   override func viewDidLoad(){
      super.viewDidLoad()

      self.secondVC.delegate = self
   }
}

2 个答案:

答案 0 :(得分:1)

使用这些链接可以准确了解如何在swift中使用Protocols:

您必须在第一个视图控制器中实现以下代码行: -

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showSecondViewController" {
        let secondViewController = segue.destination as! SecondViewController
        secondViewController.delegate = self
        }
    }

答案 1 :(得分:1)

  

我尝试使用协议,但它没有。

因为你从未将它设置为任何东西。当您按下SecondViewController时,将您的valueDelegate设置为MainViewController是您的工作。但你没有。

您所做的是将另一个 SecondViewController的valueDelegate设置为MainViewController:

var secondVC = SecondViewController()
self.secondVC.delegate = self

这很愚蠢,因为secondVC是一个不同的,新制作的SecondViewController实例,与你的真实界面完全无关。特别是,它不是被推送的SecondViewController实例。但这是您需要设置委托的实例。