委托方法不是swift ios?

委托方法不是swift ios?,ios,swift,xcode,delegates,segue,Ios,Swift,Xcode,Delegates,Segue,我们有两个控制器-ControllerA和ControllerB。控制器A包含普通按钮和文本字段(邮件id)。当我们输入mailid并点击按钮时。我们将展示ViewControllerB,我们有一个选项,名为更改电子邮件并单击“上一步”。我们使用委托将viewControllerB值传递给ViewController。但不调用委托函数 视图控制器B: protocol countryViewControllerDelegate{ func passMailId(code: String) }

我们有两个控制器-ControllerA和ControllerB。控制器A包含普通按钮和文本字段(邮件id)。当我们输入mailid并点击按钮时。我们将展示ViewControllerB,我们有一个选项,名为更改电子邮件并单击“上一步”。我们使用委托将viewControllerB值传递给ViewController。但不调用委托函数

视图控制器B:

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

}

是否有其他方法解决此问题?

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

var instance = ViewControllerB()
所以你要么在场

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

内部
prepareForSegue

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

    }
}
只需使用
prepare(对于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目标

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

视图控制器:

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


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

}
视图控制器2:

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


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

}

@除了下面的答案外,还要确保正确定义和使用委托函数[passMailId()vs countryCode()]。