Swift中代理的使用

作者: 下班不写程序 | 来源:发表于2020-03-25 11:52 被阅读0次
    和OC中完全相同, 简单分为以下六步:
    1. 委托方 定义协议, 只要遵守协议, 都能使用我的委托方法
    2. 委托方 定义协议方法
    3. 委托方 声明代理属性
    4. 委托方 执行代理
    5. 被委托方 遵守代理协议, 第一次实例化委托方时 设置代理
    6. 被委托方 调用代理方法

    下面以cell上的按钮点击事件为例:

    ViewController.swift 代码
    import UIKit
    
    class ViewController: UITableViewController {
        
        override func viewDidLoad() {
            super.viewDidLoad()
            tableView.register(CustomCell.classForCoder(), forCellReuseIdentifier: "cell")
            tableView.tableFooterView = UIView()
        }
    
        override func numberOfSections(in tableView: UITableView) -> Int {
            return 1
        }
        
        override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return 1
        }
        
        override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! CustomCell
            cell.backgroundColor = .purple;
            cell.selectionStyle = UITableViewCell.SelectionStyle.none
            
            // 05.2 在第一次实例化 CustomCell 的时候, 设置代理
            cell.delegate = self
            return cell
        }
        
        override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
            return 100
        }
    }
    
    // 05.1 遵守代理协议
    /** extension
     -- extension 类似于 OC 中的 Category
     -- 格式: extension 类名 {}
     -- Swift中 代码可读性差, 通过 extension 完成代码分块, 增强可读性, 单一模块单独处理, 增大了当前类的作用域
     -- extension 中 可以添加计算型属性 不能添加存储型属性; 可以定义便利构造函数 不能定义指定构造函数
     */
    extension ViewController: CustomCellDelegate{
        // 06. 实现代理方法
        func whiteButtonClick() {
            print("ViewController中监听到了按钮点击")
        }
    }
    
    CustomCell.swift 代码
    import UIKit
    
    // 01. 定义协议
    protocol CustomCellDelegate: NSObjectProtocol{
        // 02. 定义协议方法
        func whiteButtonClick ()
    }
    
    class CustomCell: UITableViewCell {
        // 03. 声明代理属性 (注:使用weak修饰, 该协议需要继承NSObjectProtocol基协议, 且注意代理名称是否重复)
        weak var delegate: CustomCellDelegate?
        
        lazy var button: UIButton = {
           
            let btn = UIButton(type: UIButton.ButtonType.custom)
            btn.setTitleColor(UIColor.black, for: UIControl.State.normal)
            btn.backgroundColor = UIColor.white
            btn.frame = CGRect(x: 50, y: 20, width: 60, height: 60)
            btn.addTarget(self, action: #selector(ButtonClick), for: .touchUpInside)
            return btn
        }()
        
        override func awakeFromNib() {
            super.awakeFromNib()
            // Initialization code
        }
    
        override func setSelected(_ selected: Bool, animated: Bool) {
            super.setSelected(selected, animated: animated)
    
            // Configure the view for the selected state
        }
        
        override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
            super.init(style: style, reuseIdentifier: reuseIdentifier)
            setupUI()
        }
        
        required init?(coder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
        
        func setupUI() {
            addSubview(button)
        }
        
        @objc func ButtonClick() {
            // 04. 执行代理
            delegate?.whiteButtonClick()
        }
    }
    
    extension关键字 (上面 ViewController.swift 中有涉及)
    1. extension 类似于 OC 中的 Category
    2. 格式: extension 类名 {}
    3. Swift中 代码可读性差, 通过 extension 完成代码分块, 增强可读性, 也就相当于增大了当前类的作用域
    4. extension 中 可以添加计算型属性 不能添加存储型属性; 可以定义便利构造函数 不能定义指定构造函数

    .End

    相关文章

      网友评论

        本文标题:Swift中代理的使用

        本文链接:https://www.haomeiwen.com/subject/msltuhtx.html