- 以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)!)
}
注
- 在添加协议的时候可能会报以上错误,原因是因为没有实现protocol中的方法,protocol中的方法默认是必须实现的。可选实现需在协议和方法前加
@objc
,代码如下:
@objc protocol LoginViewDelegate: class {
@objc optional func loginButtonClick(btn: UIButton)
}
网友评论