簡體   English   中英

委托方法不叫swift ios?

[英]Delegate method is not called swift ios?

我們有兩個控制器 - 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)

}

視圖控制器A:

 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(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 目的地。

您可以在以下代碼中使用委托或實例。 它對任何人都有用:

視圖控制器:

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


}

視圖控制器2:

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

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM