[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里.
再分别实现UITableViewDelegateUITableViewDataSource, 这里写在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
  }
   

本站声明:
1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;

2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;

3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;

4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;

5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/293379.html

(0)
上一篇 2022年11月22日
下一篇 2022年11月22日

相关推荐

发表回复

登录后才能评论