UITableView
ios中的tableview有点像android中的listview或者recycleview,tableview由UITableViewCell组成,UITableViewCell负责显示数据
(1)创建一个UITableViewCell
通过自定义view可以生成一个自定义cell,在相应的类记得要继承UITableViewCell
import UIKit
class paymentCellview: UITableViewCell {
@IBOutlet weak var label_date: UILabel!
@IBOutlet weak var label_status: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
}
(2)创建UITableView
在tableview中我们要继承相应的UITableViewDataSource和UITableViewDelegate
- UITableViewDataSource 表视图数据源协议,用来控制表视图的显示内容
- UITableViewDelegate 表视图代理,用来控制cell高度和选中cell后的事件
import UIKit
class ViewController:UIViewController,UITableViewDataSource,UITableViewDelegate {
override func viewDidLoad() {
super.viewDidLoad()
let tableView = UITableView(frame: view.bounds, style: .grouped)
tableView.backgroundColor = UIColor.white;
view.addSubview(tableView)
tableView.dataSource = self
tableView.delegate = self
}
//MARK: UITableViewDataSource
// cell的个数
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 10
}
// UITableViewCell
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cellid = "testCellID"
var cell = tableView.dequeueReusableCell(withIdentifier: cellid)
if cell==nil {
cell = UITableViewCell(style: .subtitle, reuseIdentifier: cellid)
}
cell?.textLabel?.text = "这个是标题~"
cell?.detailTextLabel?.text = "这里是内容了油~"
cell?.imageView?.image = UIImage(named:"Expense_success")
return cell!
}
//MARK: UITableViewDelegate
// 设置cell高度
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 44.0
}
// 选中cell后执行此方法
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
print(indexPath.row)
}
}
(3)关于tableview中的cell自适应高度
去掉默认设置的cell的高度 在xib中设置好相应的约束constraints即可
// func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
// return 44.0
// }
(4)关于UITableViewDelegate\UITableViewDataSource执行顺序
执行顺序(iOS11 默认开启可预估高度)
(开启后先执行cellForRowAtIndexPath后执行heightForRowAtIndexPath)
- numberOfSections 调用代理确定有几个分区
- 判断是否有headerview和footervier 有就确定下每个分区表头和表尾的高度
- heightForHeaderInSection \ heightForFooterInSection
- numberOfRowsInSection 确定每个分区cell的数量
- heightForRowAtIndexPath 确定每个cell的高度 根据每个selection和row的数量 循环执行代码
- cellForRowAtIndexPath 执行以上顺序后 调用返回Cell代理的方法获取Cell
- heightForRowAtIndexPath 重复返回cell的高度
- willDisplay forRowAtIndexPath 将cell要显示到屏幕上