简体   繁体   中英

Delegate method is not called swift ios?

We have two controller - ControllerA and ControllerB. Controller A contains the normal button and text field(mail id). When we enter the mailid and tap the button. we will present the ViewControllerB and we have an option called to change the email and click back. We are using a delegate to pass the viewControllerB value to ViewController. But delegate function is not called.

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

}

Is any other way to fix this?

Your segue instance is different than the 1 here

var instance = ViewControllerB()

So you should either present

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

OR

inside prepareForSegue

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

    }
}

Simply use prepare(for segue: ) check the code below,

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

The problem you had is that you are creating an instance from ViewControllerB

 var instance = ViewControllerB()

And segue on the other hand, it wont work because it would be considered as a new instance rather than the segue destination.

You can use either delegate or instance in the below code. It will be useful for anyone:

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.
    }
    */

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM