swift3.0代理模式

  • 以view文件和controller文件的数据传递为例,代码如下

view文件中


import UIKit
//定义协议
protocol LoginViewDelegate: class {
    func loginButtonClick(btn: UIButton)
}
class LoginView: UIView {
    //代理属性
    public weak var delegate: LoginViewDelegate?    

  override func layoutSubviews() {
       //添加一个按钮
        loginButton.setTitle("登录", for: UIControlState.normal)
        loginButton.setTitleColor(UIColor.white, for: UIControlState.normal)
        loginButton.titleLabel?.font = UIFont.systemFont(ofSize: 15)
        loginButton.frame = CGRect(x: 100, y: 100, width:50, height: 30)
        loginButton.addTarget(self, action:#selector(loginButtonClick), for: .touchUpInside)
        self.addSubview(loginButton)
  }
    //按钮的点击事件
    func loginButtonClick() {
        print(""点击了登录按钮")
        //调用代理方法
        delegate?.loginButtonClick(btn: loginButton)
    }
}

controller文件中

class LoginViewController: UIViewController,LoginViewDelegate{
        //初始化一个LoginView对象
        let loginView = LoginView()
        loginView.frame = self.view.frame
        self.view.addSubview(loginView)
         //设置代理属性
        loginView.delegate = self
 }
    //MARK: - LoginViewDelegate实现代理方法
    func loginButtonClick(btn: UIButton) {
        print("调用了代理方法-----" + (btn.titleLabel?.text)!)
    }


Snip20170106_1.png

  • 在添加协议的时候可能会报以上错误,原因是因为没有实现protocol中的方法,protocol中的方法默认是必须实现的。可选实现需在协议和方法前加@objc,代码如下:
@objc protocol LoginViewDelegate: class {
    @objc optional func loginButtonClick(btn: UIButton)
}

你可能感兴趣的:(swift3.0代理模式)