自定义协议委托方法不调用

时间:2017-07-03 09:59:36

标签: ios swift3 delegates swift-protocols

我正在尝试使用自定义协议从另一个视图控制器更改一个视图控制器的标签,但其委托方法未被调用

ViewController3代码:

当我点击关闭按钮时,我的ViewController2中没有调用委托方法。

protocol ViewController3Delegate: class {

  func changeLable(_ text: String)
}

class ViewController3: UIViewController {

  weak var delegate: ViewController3Delegate?

  override func viewDidLoad() {
    super.viewDidLoad()

  }

  override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()

  }

  @IBAction func btnCloseAction(_ sender: Any) {

    delegate?.changeLable("fillter applied")
    self.dismiss(animated: true, completion: nil)
  }
}

ViewController2代码:

class ViewController2: UIViewController,ViewController3Delegate {

  @IBOutlet weak var lblReport: UILabel!

  let VC3 = ViewController3(nibName: "ViewController3", bundle: nil)

  override func viewDidLoad() {

    super.viewDidLoad()
    VC3.delegate = self
  }

  func changeLable(_ text: String) {

    print("delegate called")
  }

  override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()

  }
}

有人知道我哪里错了,请建议我解决方案

2 个答案:

答案 0 :(得分:0)

您应首先从ViewController2呈现ViewController3,如下所示:

let VC3 = ViewController3(nibName: "ViewController3", bundle: nil)
VC3.delegate = self
self.presentViewController(VC3, animated: true, completion: nil)

此外,您可以删除viewDidLoad

上方的这一行
let VC3 = ViewController3(nibName: "ViewController3", bundle: nil)

答案 1 :(得分:0)

您尚未在ViewController2中定义委托,该委托将用于ViewController3中的委托。

见:

 protocol ViewController3Delegate: class {

      func changeLable(_ text: String)
    }

    class ViewController3: UIViewController {

      weak var delegate: ViewController3Delegate?

      override func viewDidLoad() {
        super.viewDidLoad()

      }

      override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()

      }

      @IBAction func btnCloseAction(_ sender: Any) {
        if delgate !=nil {

        delegate?.changeLable("fillter applied")
        self.dismiss(animated: true, completion: nil)
    }
      }
    }

然后在你的ViewController2类中:

    class ViewController2: UIViewController,ViewController3Delegate {

      @IBOutlet weak var lblReport: UILabel!


      override func viewDidLoad() {

        super.viewDidLoad()
      }

      func changeLable(_ text: String) {

        print("delegate called")
      }

      override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()

      }
          override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
             {

                 if segue.identifier = "Yoursegueientifier"
                  {
                     let vc = segue.destination as! ViewController3
                     vc.delegate = self
                  }                
            }
    }

注意:您必须在故事板中定义segueidentifer名称

相关问题