Swift 从零开始 15_自定义tableViewCell及自定义cell删除按钮

MARK: 此篇介绍的是用纯代码自定义封装cell,xib及sb后续更新.

1.创建自定义cell文件,继承UITableViewCell

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import UIKit
class RecordTableViewCell: UITableViewCell {
var deleteBtn: UIButton!
override func awakeFromNib() {
super.awakeFromNib()
//设置cell的分割线顶靠屏幕边缘(自定义方法)
setSeparatorByEdge()
}
//如果子控件的frame会根据内容的变化而变化(即每个cell的子控件不是完全一样的),
考虑到cell会重用,这种时候就不在这里直接写死子控件的frame,
而是重写layouSubviews方法,动态的根据计算子控件的frame.
override func layoutSubviews() {
super.layoutSubviews()
setUpViews()
}
//重写initWithStyle:方法,在里面创建所有可能出现的子控件
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
if !self.isEqual(nil) {
deleteBtn = UIButton()
self.contentView.addSubview(deleteBtn)
}
}
func setUpViews() {
deleteBtn("删除cell", forState: UIControlState.Normal)
deleteBtn.setTitleColor(UIColor.hexStringToColor("#EA5413"), forState: UIControlState.Normal)
deleteBtn.titleLabel?.font = UIFont.systemFontOfSize(12)
deleteBtn.layer.borderWidth = 1
deleteBtn.layer.borderColor = UIColor.hexStringToColor("ea5413").CGColor
deleteBtn.snp_makeConstraints(closure: { (make) in
make.centerY.equalTo(self.contentView.snp_centerY)
make.right.equalTo(self.contentView.snp_right).offset(-10)
make.width.equalTo(self.contentView.snp_width).multipliedBy(0.155)
make.height.equalTo(self.contentView.snp_height).multipliedBy(0.455)
})
}
required init?(coder aDecoder: 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
}
}

2.在控制器中

(1) 注册cell

1
tableView.registerClass(RecordTableViewCell.classForCoder(), forCellReuseIdentifier: "cell")

(2) cellForRowAtIndex方法中创建自定义cell

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell: RecordTableViewCell = self.tableView.dequeueReusableCellWithIdentifier(identifier) as! RecordTableViewCell
cell.backgroundColor = UIColor.clearColor()
cell.deleteBtn.tag = indexPath.row
cell.deleteBtn.addTarget(self, action: #selector(RecordViewController.deleteBtnClick(_:)), forControlEvents: UIControlEvents.TouchUpInside)
return cell
}
//deleteBtn响应方法
func deleteBtnClick(sender: UIButton) {
dataSourceArr.removeAtIndex(sender.tag)
tableView.reloadData()
}

总结:

代码自定义cell要注意cell下子控件的创建及frame约束等.这里只是提供一个思路,抛砖引玉,具体的需求具体对待.