我正在尝试在Swift游乐场中添加UITableView
但由于某种原因它没有加载。这是我的代码:
class MyViewController : UIViewController,UITableViewDelegate,UITableViewDataSource {
let content = ["One", "Two"]
var tableView = UITableView()
override func loadView() {
let view = UIView()
view.backgroundColor = .red
self.view = view
}
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = .blue
self.tableView = UITableView(frame: self.view.bounds, style: .plain)
self.tableView.delegate = self
self.tableView.dataSource = self
self.view.addSubview(self.tableView)
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.content.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
if cell.detailTextLabel == nil {
cell = UITableViewCell(style: .value1, reuseIdentifier: "cell")
}
cell.textLabel?.text = self.content[indexPath.row]
return cell
}
}
PlaygroundPage.current.liveView = MyViewController()
你们有没有人知道为什么没有在视图中加载tableview?
答案 0 :(得分:1)
您应该在底部的super.loadView()
中添加override func loadView()
并且适当访问该方法的超类版本
有关super
和LoadView
函数的详细信息,
请点击这些链接super Class和loadView()
答案 1 :(得分:0)
您忘记将单元格注册到表格视图。 添加表视图后执行此操作。
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
答案 2 :(得分:0)
在self.view.bounds
上创建表格视图时,请尝试打印viewDidLoad
的尺寸,我怀疑它是.zero
。
我试过这个并且有效:
import UIKit
import PlaygroundSupport
class MyViewController : UIViewController, UITableViewDataSource {
let content = ["One", "Two"]
var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
tableView = UITableView(frame: .zero)
tableView.translatesAutoresizingMaskIntoConstraints = false
tableView.dataSource = self
view.addSubview(tableView)
NSLayoutConstraint.activate([
tableView.topAnchor.constraint(equalTo: view.topAnchor),
tableView.rightAnchor.constraint(equalTo: view.rightAnchor),
tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
tableView.leftAnchor.constraint(equalTo: view.leftAnchor)
])
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return content.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell(style: .default, reuseIdentifier: nil)
cell.textLabel?.text = content[indexPath.row]
return cell
}
}
PlaygroundPage.current.liveView = MyViewController()
答案 3 :(得分:0)
没有显示单元格的原因是
你不应该在viewDidLoad
中做布局/几何内容,因为在这种方法的通话时间内,帧和边界是不可预测的。
您可以使用自动布局将表格视图连接到外部视图的维度,也可以使用viewDidAppear
更新框架:
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = .blue
print (self.view.bounds) // (0.0, 0.0, 0.0, 0.0)
self.tableView = UITableView(frame: self.view.bounds, style: .plain)
self.tableView.delegate = self
self.tableView.dataSource = self
self.view.addSubview(self.tableView)
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
super.viewDidLoad()
}
override func viewDidAppear(_ animated: Bool) {
print (self.view.bounds) // (0.0, 0.0, 375.0, 668.0)
self.tableView.frame = self.view.bounds
}
或使用自动布局:
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = .blue
print (self.view.bounds) // (0.0, 0.0, 0.0, 0.0)
self.tableView = UITableView(frame: self.view.bounds, style: .plain)
self.tableView.delegate = self
self.tableView.dataSource = self
self.view.addSubview(self.tableView)
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
tableView.translatesAutoresizingMaskIntoConstraints = false
tableView.topAnchor.constraint(equalTo: view.topAnchor, constant: 0).isActive = true
tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0).isActive = true
tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0).isActive = true
tableView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 0).isActive = true
super.viewDidLoad()
}