Swift进阶学习三——闭包使用、代理传值、通知使用、UITableView使用

掌握基本控件使用,接下来学习闭包、代理、通知的使用,创建一个UITableView来展示闭包、代理、通知,以及介绍UITableView的使用。

1,UITableView创建,创建一个UITableView,并设置代理,创建方法如下

//设置btn、tabview.    let tabView = UITableView()
//let tabvieid = "tabvieid"  //注册单元格
//let btn =  UIButton(type: .custom) //用来验证闭包、代理、通知传值


//viewDidLoad实现两个控件创建
        btn.setTitle("我是一个按钮", for: .normal)
        btn.backgroundColor = UIColor.red
        self.view.addSubview(btn)
        btn.mas_makeConstraints({ (make: MASConstraintMaker?) in
            make?.top.left().equalTo()(self.view)?.offset()
            make?.height.mas_equalTo()(100)
            make?.width.equalTo()(self.view)
        })
//        btn.addTarget(self, action: Selector(tapped(sender: btn)), for: .touchUpInside)
        btn.addTarget(self, action: #selector(tapped), for: .touchUpInside)
        
        
        tabView.register(FirstTableCell.self, forCellReuseIdentifier: tabvieid)
        tabView.delegate = self
        tabView.dataSource = self
        self.view.addSubview(tabView)

        tabView.mas_makeConstraints({ (make: MASConstraintMaker?) in
            make?.top.equalTo()(btn.mas_bottom)?.offset()
            make?.bottom.equalTo()(self.view.mas_bottom)
            make?.left.width().equalTo()(self.view)

        })

这里一般把代理方法统一放到一个对应extension协议里面,提高代码的可读性。UITableView的代理代码如下。if let cell = tabView.dequeueReusableCell(withIdentifier: tabvieid, for: indexPath) as? FirstTableCell,是指判断获取的单元格是FirstTableCell,当有多种单元格注册时,判断对应单元格做对应的事。as?是可选的必须要进行非空处理,else后面标识如果没有单元格就返回一个单元格。

// MARK: - extension 扩展方法
extension ViewController: UITableViewDelegate,UITableViewDataSource  {
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 10;
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if  let cell = tabView.dequeueReusableCell(withIdentifier: tabvieid, for: indexPath) as? FirstTableCell{
            cell.delegate = self //设置代理
            cell.callBack = { [weak self] (str: String)->Void in

                self?.btn.setTitle(str, for: .normal)

            }  //这里设置闭包
            return cell

        }else{
            
            return tabView.dequeueReusableCell(withIdentifier: tabvieid, for: indexPath)
        }
    }
    
}

2,闭包、代理、通知的创建,上面是创建FirstTableCell自定义单元格,在这里面实现闭包、代理、通知的发送。代码如下

class FirstTableCell: UITableViewCell {
//    ReuseIdentifier
    let btn = UIButton(type: .custom)
    let closureBtn = UIButton(type: .custom)
    let proxyBtn = UIButton(type: .custom)
//    定义代理协议
    public weak var delegate: testDelegate?
//声明一个swiftBlock,传出--swiftBlock,没有返回值
    typealias swiftBlock = (_ str: String) -> Void
//  创建一个callBack闭包
    var callBack : swiftBlock?

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }
    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        self.initCell();
        
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }
    
    func initCell() {
        btn.setTitle("通知", for: .normal)
        btn.backgroundColor = UIColor.red
        self.contentView.addSubview(btn)
     
        btn.mas_makeConstraints({ (make: MASConstraintMaker?) in
            make?.centerY.equalTo()(self.contentView)
            make?.left.equalTo()(self.contentView)?.offset()(30)
            make?.width.mas_equalTo()(70)

        })
        
        btn.addTarget(self,action: #selector(clickBtn), for: .touchUpInside)
        
        
        closureBtn.setTitle("闭包", for: .normal)
        closureBtn.backgroundColor = UIColor.red
        self.contentView.addSubview(closureBtn)
     
        closureBtn.mas_makeConstraints({ (make: MASConstraintMaker?) in
            make?.center.equalTo()(self.contentView)
            make?.width.mas_equalTo()(70)

        })
        
        closureBtn.addTarget(self,action: #selector(clickclosureBtn), for: .touchUpInside)

        
        
        proxyBtn.setTitle("代理", for: .normal)
        proxyBtn.backgroundColor = UIColor.red
        self.contentView.addSubview(proxyBtn)
     
        proxyBtn.mas_makeConstraints({ (make: MASConstraintMaker?) in
            make?.centerY.equalTo()(self.contentView)
            make?.right.equalTo()(self.contentView)?.offset()(-30)
            make?.width.mas_equalTo()(70)

        })
        
        proxyBtn.addTarget(self,action: #selector(clickproxyBtn), for: .touchUpInside)

    }
    
    
    @objc func clickBtn(sender:UIButton){
        /// 发送简单数据
        NotificationCenter.default.post(name: NSNotification.Name.init(rawValue: "CellNotification"),object: "我是一个通知")
        
    }
    
    @objc func clickclosureBtn(sender:UIButton){
        if callBack != nil {
                   callBack!("闭包传值")
               }
        
    }
    
    
    @objc func clickproxyBtn(sender:UIButton){
        self.delegate?.changeString(newString: "代理传值")
    }
    

}

//定义声明协议
public protocol testDelegate: AnyObject {
    func changeString(newString: String)
}

3,实现后效果如下,点击对应按钮,上面对应显示。初学对这些的使用还不够熟练,创建很呆板。学习都是循序渐进的过程,更多的创建和使用方法在不断的使用过程中自然就会熟悉。坚持
在这里插入图片描述
4,对闭包的一些灵活使用案列。
检查序列中的所有元素是否满足条件,allSatisfy判断所有元素是否满足大于50

// An highlighted block
// 判断数组的所有元素是否全部大于一个数 $0表示数组中的任意元素,count表示大于10的条件元素的返回数组。
let arr = [60, 88, 95, 92]
// 返回一个BOOL
let passed = arr.allSatisfy({ $0 > 50 })
let count = arr.count(where: { $0 > 10 })
print(passed)
// 输出:true

sorted 方法,闭包排序。

// 对下面这个数组进行排序   $0 、 $1表示前后两个元素,{ $0 > $1 }排序规则
let names = [60, 88, 95, 92,54,90]

var reversed = names.sorted( by: { $0 > $1 } )
print(reversed)

最近比较忙,很久没使用就生疏、陌生。学习新的东西在于坚持、使用才能改变以往的熟悉方式的使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值