在Swift5中实现多个表视图可以吗?

时间:2019-07-14 10:57:13

标签: swift uitableview

我在Swift 5中的单个视图控制器上实现了两个表视图。我意识到,可以通过按名称标识表视图来对视图控制器进行一个扩展。但是,我想将代码分开,所以我做到了,如此处的简单示例所示-这涉及到在网上查看几个示例,因此,感谢所有发布这些内容的人!最主要的是Girish Ghoda的回答: Two tables on one view in swift

一切似乎都有效,但是我想知道我是否违反了任何重要规则...

视图控制器上有两个表视图,具有简单的约束并具有tableView1和tableView2。

这是ViewController.swift文件

import UIKit

var array1 = ["one", "two", "three"]
var array2 = ["left", "right", "centre", "outside"]

class ViewController: UIViewController {

  @IBOutlet weak var tableView1: UITableView!
  @IBOutlet weak var tableView2: UITableView!

  override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.

    initTableViews()
  }

  var dataSource1: DataSource1!
  var dataSource2: DataSource2!

  func initTableViews() {
    dataSource1 = DataSource1()
    tableView1.dataSource = dataSource1
    tableView1.delegate = dataSource1

    dataSource2 = DataSource2()
    tableView2.dataSource = dataSource2
    tableView2.delegate = dataSource2

  }

}

然后有两个文件:

TableViewClass1.swift

import UIKit

class DataSource1: NSObject, UITableViewDataSource, UITableViewDelegate {

  override init(){
    super.init()
  }

  func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return array1.count
  }

  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell1", for: indexPath)

    cell.textLabel?.numberOfLines = 0

    cell.textLabel?.text = array1[indexPath.row]

    return cell
  }

}

TableViewClass2.swift:

import UIKit

class DataSource2: NSObject, UITableViewDataSource, UITableViewDelegate {

  override init(){
    super.init()
  }

  func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return array2.count
  }

  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell2", for: indexPath)

    cell.textLabel?.numberOfLines = 0

    cell.textLabel?.text = array2[indexPath.row]

    return cell
  }
}

正如我所说,一切似乎都很好,因此提出这个问题似乎很奇怪,但是尽管该方法似乎给出了简单的代码结构,但我想知道这里是否存在任何可能导致问题的东西。

非常感谢, 伊恩

1 个答案:

答案 0 :(得分:0)

这很好,但是如果两个类都是多余的,我将使用具有方便的初始化程序和延迟实例化的DataSource属性的一个 dataSource

class DataSource: NSObject, UITableViewDataSource, UITableViewDelegate {

    var array : [String]
    let cellIdentifier : String

    init(array: [String], cellIdentifier : String )
    {
        self.array = array
        self.cellIdentifier = cellIdentifier
        super.init()
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return array.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath)

        cell.textLabel?.numberOfLines = 0

        cell.textLabel?.text = array[indexPath.row]

        return cell
    }

}

lazy var dataSource1: DataSource = {
    return DataSource(array: array1, cellIdentifier: "cell1")
}()

lazy var dataSource2: DataSource = {
    return DataSource(array: array2, cellIdentifier: "cell2")
}()


func initTableViews() {
  tableView1.dataSource = dataSource1
  tableView1.delegate = dataSource1

  tableView2.dataSource = dataSource2
  tableView2.delegate = dataSource2
}