Метод делегата не называется swift ios? - PullRequest
0 голосов
/ 18 марта 2019

У нас есть два контроллера - ControllerA и ControllerB. Контроллер A содержит обычную кнопку и текстовое поле (почтовый идентификатор). Когда мы вводим 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 ]

4 голосов
/ 18 марта 2019

Ваш экземпляр 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

    }
}
2 голосов
/ 18 марта 2019

Просто используйте 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()

и переходите кс другой стороны, он не будет работать, потому что он будет рассматриваться как новый экземпляр, а не как конечный пункт назначения.

0 голосов
/ 19 марта 2019

Вы можете использовать делегат или экземпляр в приведенном ниже коде.Это будет полезно всем:

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

}
...