同一 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】:
您需要以某种方式限制tableView1
或tableView2
的高度(一旦确定了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 的内容?