[Android开发学iOS系列] TableView展现一个list
作者:互联网
TableView用来做什么
TableView用来展示一个很长的list.
和Android中的RecyclerView不同, iOS中的TableView只能是竖直方向的list.
如何写一个最简单的TableView
一个最简单的TableViewController看起来像这样:
class ViewController: UITableViewController { |
|
var data: [String] = [] |
|
override func viewDidLoad() { |
|
super.viewDidLoad() |
|
// Do any additional setup after loading the view. |
|
// loadData() |
|
print(data) |
|
} |
|
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { |
|
data.count |
|
} |
|
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { |
|
let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath) |
|
cell.textLabel?.text = data[indexPath.row] |
|
return cell |
|
} |
|
} |
这里data是想展示的数据类型, 可以hardcode一些数据.
这么简单是因为这个ViewController继承了UITableViewController
, 并且cell的部分使用了storyboard.
这里需要用dequeueReusableCell
方法, 是为了cell的复用, 因为list内容很多的时候cell view是可以循环使用的. (很像Android里的RecyclerView).
UITableViewController
的签名是这样:
open class UITableViewController : UIViewController, UITableViewDelegate, UITableViewDataSource { |
它为我们做了以下三件事:
- 设置view为一个
UITableView
. - 设置
delegate=self
. - 设置
dataSource=self
.
这种方式的局限性在于第一点, 它的根view是一个TableView, 如果我们的需求比较复杂, 不仅仅是一个demo, 那么可能需要组合View.
拆解版TableView
我们也可以直接继承UIViewController
类, 然后自己动手做上面的几条设置.
Delegate & DataSource
TableView有两个重要的方面需要关注:
- UITableViewDelegate: 管理和用户的交互, 比如选择, 滑动手势等. 没有必须要实现的方法.
- UITableViewDataSource: 提供和管理数据, 包括了数据对应的cell或者header. 有两个必须要实现的方法(如上面的代码例子所示).
继承UIViewController
继承UIViewController而不是UITableViewController
之后, 需要自己写一个tableView并加在view里.
再分别实现UITableViewDelegate
和UITableViewDataSource
, 这里写在extension里, 拆分完之后set给tableView:
tableView.delegate = self |
|
tableView.dataSource = self |
整体改造后代码如下:
class ViewController: UIViewController { |
|
var data: [String] = ["Hello", "World"] |
|
private let tableView = UITableView() |
|
override func loadView() { |
|
view = UIView() |
|
view.addSubview(tableView) |
|
tableView.translatesAutoresizingMaskIntoConstraints = false |
|
NSLayoutConstraint.activate([ |
|
tableView.topAnchor.constraint(equalTo: view.topAnchor), |
|
tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor), |
|
tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor), |
|
tableView.trailingAnchor.constraint(equalTo: view.trailingAnchor), |
|
]) |
|
} |
|
override func viewDidLoad() { |
|
super.viewDidLoad() |
|
tableView.register(MyCell.self, forCellReuseIdentifier: "MyCell") |
|
tableView.delegate = self |
|
tableView.dataSource = self |
|
} |
|
} |
|
extension ViewController: UITableViewDelegate {} |
|
extension ViewController: UITableViewDataSource { |
|
func tableView(_: UITableView, numberOfRowsInSection _: Int) -> Int { |
|
data.count |
|
} |
|