委托方法不叫Swift iOS?

时间:2019-03-18 14:57:05

标签: ios swift xcode delegates segue

我们有两个控制器-ControllerA和ControllerB。控制器A包含普通按钮和文本字段(邮件ID)。当我们输入mailid并点击按钮时。我们将显示ViewControllerB,并且有一个名为的选项可以更改电子邮件并单击返回。我们正在使用委托将viewControllerB值传递给ViewController。但是没有调用委托函数。

ViewControllerB:

protocol countryViewControllerDelegate{
  func passMailId(code: String)
}

var delegate: countryControllerDelegate?

@IBAction func createNewFolder(_ sender: Any?) {
   delegate?.countryCode(code: emailText.text)
self.dismiss(animated: true, completion: nil)

}

ViewControllerA:

 var instance = ViewControllerB()

    override func viewDidLoad() {

    instance.delegate = self
}

func showCoutryPicker(){
    self.performSegue(withIdentifier: "DropDown", sender: self)
  }


extension ViewControllerA:countryViewControllerDelegate{
  func countryCode(code: String) {
    print(code)
  }

}

还有其他解决方法吗?

3 个答案:

答案 0 :(得分:4)

您的segue实例不同于此处的1

var instance = ViewControllerB()

所以你要么在场

self.present(instance,animated:true,completion:nil)

OR

prepareForSegue

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "DropDown" {
      let des = segue.destination as! ViewControllerB
      des.delegate = self

    }
}

答案 1 :(得分:2)

只需使用prepare(for segue: )检查下面的代码,

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

您遇到的问题是您正在从ViewControllerB创建一个实例

 var instance = ViewControllerB()

另一方面,segue无法正常工作,因为它将被视为新实例而不是segue目的地。

答案 2 :(得分:0)

您可以在以下代码中使用委托或实例。它将对任何人都有用:

ViewController:

class ViewController: UIViewController {


    @IBOutlet weak var myTextField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()
        myTextField.text = "Hello World"
        // Do any additional setup after loading the view, typically from a nib.
    }
    // Without segue
    @IBAction func passData(_ sender: Any) {
        let sb = storyboard?.instantiateViewController(withIdentifier: "viewcontroller2") as! ViewController2
        sb.passText = "Hello World"
        //set self to Delegate
        sb.delegate = self
        //set self to Instance
        sb.instance = self
        present(sb, animated: true, completion: nil)
    }
    // With segue
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let sb = segue.destination as! ViewController2
        sb.passTextSegue = "Hello World with segue"
        //set self to Delegate
        sb.delegate = self
        //set self to Instance
        sb.instance = self
    }




}
extension ViewController : ViewController2Delegate{
    func passValue(Str: String) {
        print(Str)
    }


}

ViewController2:

protocol ViewController2Delegate : class {
    func passValue(Str:String)
}
class ViewController2: UIViewController {
        //Create instance for Delegate
    weak var delegate : ViewController2Delegate?
        //Create instance for ViewController
    var instance: ViewController?

    override func viewDidLoad() {
        super.viewDidLoad()
        myTextField.text = passText
        myTextFieldSegue.text = passTextSegue
        // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBOutlet weak var myTextField: UITextField!
    var passText: String?

    @IBOutlet weak var myTextFieldSegue: UITextField!
    var passTextSegue: String?


    @IBAction func manage(_ sender: UIButton) {
        //Pass value using Delegate
        delegate?.passValue(Str: "Happy Coding~")
        //Pass value using Instance
        instance?.myTextField.text = "Happy Coding~ :)"
        dismiss(animated: true, completion: nil)
    }


    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destinationViewController.
        // Pass the selected object to the new view controller.
    }
    */

}