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

Posted

技术标签:

【中文标题】同一 ViewController 中的两个 tableViews 不会在 swift 3 中显示【英文标题】:Two tableViews in same ViewController won't show in swift 3 【发布时间】:2017-10-01 09:00:07 【问题描述】:

我试图在同一个 ViewController 中有两个 UITableView。我正在尝试以编程方式完成所有操作,但由于某种原因,tableViews 都没有显示。

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

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) 
    //...



【问题讨论】:

为什么要通过代码添加Constraints @Buntylm 我想以编程方式完成所有事情。它不应该影响其余代码的性能吗? 我强烈建议您使用一个表和两个部分。少画多优雅。 【参考方案1】:

您需要以某种方式限制tableView1tableView2 的高度(一旦确定了1 个高度,就可以推断出另一个高度)。目前,您已经告诉 autolayout 两个表视图必须垂直相隔 15 倍,但就超级视图而言,这不是分开的位置。结果,自动布局可能将tableView1 调整为超级视图的完整高度,而另一个表视图不在屏幕上,因此它的数据源方法不会被调用

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

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

【讨论】:

【参考方案2】:

tableView 的一个警告是它的 datasource 方法不会被调用,除非 view 有它的 frame 。如果 tableView 尝试自己呈现它并且找不到它的帧有效数据源方法将永远不会被调用。 您需要检查两个 tableView 是否都定义了它的框架

【讨论】:

以上是关于同一 ViewController 中的两个 tableViews 不会在 swift 3 中显示的主要内容,如果未能解决你的问题,请参考以下文章

如何在同一个 ViewController 中初始化两个 NSObject 实例 - Swift

我可以为 iOS 6 和 iOS 7 为同一个 VIewController 设置两个不同的 xib 吗?

如何通过同一个 ViewController(在故事板上创建)在两个视图(在 xib 上创建)之间切换?

如何通过来自同一个 TableViewController 的多个 segue 到同一个 ViewController

Swift UIcollectionView 在同一个 ViewController 上更改第二个 UICollectionView 的内容?

如何在一个 ViewController 中使用两个 Webview?