掌握基本控件使用,接下来学习闭包、代理、通知的使用,创建一个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)
最近比较忙,很久没使用就生疏、陌生。学习新的东西在于坚持、使用才能改变以往的熟悉方式的使用。