Swift5.x的UITableView纯代码演练
//
// ViewController.swift
// 1-UITableView演练
// Created by 鲁军 on 2021/3/13.
/*
CMD + Shift + O 快速打开文件
CMD + Shift + J 快速定位文件
**/
import UIKit
class ViewController: UIViewController {
private lazy var tableView : UITableView = { () -> UITableView in
//在实例化 tableView的时候,需要指定样式,指定之后 不能再修改
let tb = UITableView(frame: CGRect.zero, style: .plain)
//设定数据源
tb.dataSource = self
//注册可重用cell [UITableViewCell class] //纯代码注册一个可重用的cell
tb.register(UITableViewCell.self, forCellReuseIdentifier: "Cell") //使用一行代码需要注册,必须注册
//使用三行代码的时候,可以不注册,但是必须进行强制解包
return tb
}()
//第二种懒加载的方式
// private lazy var tableView2 : UITableView = {
// let tb1 = UITableView(frame: CGRect.zero, style: .plain)
// return tb1
// }()
//是用纯代码创建视图层次结构 和 storyboard / xib 等价
override func loadView() {
//在访问 view的时候 如果view == nil 会自动调用loadView 方法
// print(view)
//设置视图
view = tableView
print(tableView)
}
override func viewDidLoad() {
super.viewDidLoad()
}
}
//将 一起相关的代码放在一起 便于阅读和维护 //遵守数据源的协议
// 在swift中 遵守协议的写法 类似于其他语言的多继承
//测试题 OC 中 有多继承吗 如果没有 如果替代 !
extension ViewController : UITableViewDataSource,UITableViewDelegate{
//UITableViewController 会需要override 因为 UITableViewController 已经遵守了协议
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 50
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// 使用此方法 必须注册可重用cell 在ios6.0推出的 替代以下三行代码 //在storyboard 添加 Cell identity
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
cell.textLabel?.text = "hello \(indexPath.row)"
return cell
//以下代码在ios 7.0 之后就不太使用了
//使用此方法 不要求必须注册可重用的cell 返回值是可选的
/*
var cell = tableView.dequeueReusableCell(withIdentifier: "cell")
if cell==nil {
cell = UITableViewCell(style: .default, reuseIdentifier: "cell")
}
// cell?.textLabel //可选的
cell?.textLabel?.text = "hello \(indexPath.row)"
return cell!
*/
}
}