同一ViewController中的两个tableViews不会在swift 3中显示

时间:2017-10-01 09:00:08

标签: ios uitableview swift3

我想在同一个ViewController中有两个UITableView。我试图以编程方式执行所有操作但由于某种原因,两个tableView都没有显示。

我注意到代码永远不会到达

else if tableView == self.tableView2 {

}
在cellForRowAt方法中

。我不知道为什么会这样。

我感谢任何帮助来解决这个问题。

 import UIKit

 class TestViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

var tableView1: UITableView?
var tableView2: UITableView?

let tableView1Data = ["Option 1", "Option 2", "Option 3", "Option 4", "Other"]
let tableView2Data = ["Cancel"]

override func viewDidLoad() {
    super.viewDidLoad()

    view.backgroundColor = .apricot

    // Initalize
    tableView1 = UITableView()
    tableView2 = UITableView()

    // Register cells
    // tableView1!.register(UITableViewCell.self, forCellReuseIdentifier: "Cell1")
    // tableView2!.register(UITableViewCell.self, forCellReuseIdentifier: "Cell2")

    tableView1!.register(UINib(nibName: "yourNib", bundle: nil), forCellReuseIdentifier: "Cell1")
    tableView2!.register(UINib(nibName: "yourNib", bundle: nil), forCellReuseIdentifier: "Cell2")

    // Set delegates
    tableView1!.delegate = self
    tableView1!.dataSource = self

    tableView2!.delegate = self
    tableView2!.dataSource = self

    // Add to view
    view.addSubview(tableView1!)
    view.addSubview(tableView2!)

    // Set size constraints
    tableView1!.translatesAutoresizingMaskIntoConstraints = false
    tableView1!.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
    tableView1!.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
    tableView1!.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true

    tableView2!.translatesAutoresizingMaskIntoConstraints = false
    tableView2!.topAnchor.constraint(equalTo: tableView1!.bottomAnchor, constant: 15).isActive = true
    tableView2!.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
    tableView2!.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true

    // Customize looks
    tableView1!.layer.cornerRadius = 10
    tableView2!.layer.cornerRadius = 10

    // Reload data
    tableView1!.reloadData()
    tableView2!.reloadData()
}

override func viewDidAppear(_ animated: Bool) {
    tableView1!.reloadData()
    tableView2!.reloadData()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    if tableView == self.tableView1 {
        return tableView1Data.count
    }

    else if tableView == self.tableView2 {
        return tableView2Data.count
    }
    return 0
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    var cell: UITableViewCell?

    if tableView == self.tableView1 {

        cell = tableView.dequeueReusableCell(withIdentifier: "Cell1", for: indexPath)
        guard let cell = cell else {return UITableViewCell()}

        let cellLabel = UILabel()
        cellLabel.text = tableView1Data[indexPath.row]
        cellLabel.textColor = .black
        cell.addSubview(cellLabel)
        cellLabel.frame = cell.frame
    }

    else if tableView == self.tableView2 {

        cell = tableView.dequeueReusableCell(withIdentifier: "Cell2", for: indexPath)
        guard let cell = cell else {return UITableViewCell()}

        let cellLabel = UILabel()
        cellLabel.text = tableView2Data[indexPath.row]
        cellLabel.textColor = .black
        cell.addSubview(cellLabel)
        cellLabel.frame = cell.frame

    }
    return cell!
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return view.frame.height * 0.1
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    //...
}

}

2 个答案:

答案 0 :(得分:0)

你需要以某种方式限制tableView1tableView2的高度(一旦你建立了1个高度,另一个就可以推断)。目前你告诉autolayout这两个表视图必须垂直分开15,但不是在superview方面的分隔。因此,autolayout可能会将tableView1调整到superview的整个高度,而另一个tableview不在屏幕上,所以它的数据源方法不会被调用

例如,要将表格视图设置为每个屏幕的一半:

  TableView1!.bottomAnchor.constraint(equalTo:self.view.centerYAnchor, constant:-7).isActive=true

答案 1 :(得分:0)

使用tableView的一个警告是,除非视图具有框架,否则不会调用它的数据源方法。如果tableView尝试将其呈现为自己并且没有找到它,那么帧的有效数据源方法将永远不会被调用。 你需要检查tableView是否都有框架定义