Table header 来自 .xib 的视图
Table header view from .xib
我有一个 table,我需要在其中添加一个标题视图。我在 xib 文件中根据需要进行配置,但我在连接此视图时遇到问题。告诉我哪里做错了!
class HeaderTableView: UITableViewHeaderFooterView {
//I think in this class a mistake
override init(reuseIdentifier: String?) {
super.init(reuseIdentifier: reuseIdentifier)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
override func viewDidLoad() {
super.viewDidLoad()
let nib = UINib(nibName: "HeaderTableView", bundle: nil)
tableView.register(nib, forHeaderFooterViewReuseIdentifier: "HeaderTableView")
}
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let view = self.tableView.dequeueReusableHeaderFooterView(withIdentifier: "HeaderTableView") as! HeaderTableView
returnview
}
美好的一天,
Table 视图有 5 个部分,第一部分是 tableHeaderView、SectionHeader、Cell、SectionFooter 和最后的 tableFooterView。
如果您想在表格视图的顶部添加标题,您可以使用此代码。
class HeaderTableView : UIView{
var title : UILabel = {
let label = UILabel()
label.text = "My Title"
label.translatesAutoresizingMaskIntoConstraints = false
return label
}()
override init(frame: CGRect) {
super.init(frame: frame)
setupLabel()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func setupLabel(){
addSubview(title)
NSLayoutConstraint.activate([
title.centerYAnchor.constraint(equalTo: self.centerYAnchor),
title.centerXAnchor.constraint(equalTo: self.centerXAnchor),
])
}
}
class ViewController: UITableViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
var tableHeaderView = HeaderTableView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: 200))
tableHeaderView.backgroundColor = .red
tableView.tableHeaderView = tableHeaderView
}
}
所以你提到你在 xib 文件中添加了 Header 视图,因为你想从 Interface Builder 中自由设计它。
第一件事 转到基于 XIB 的 Header 视图 (HeaderTableView.xib),在 Identity Inspector 中将 class 名称放在那里您的 Header 截至 HeaderTableView
的观点:
第二件事,打开你的HeaderTableView
swiftclass(在我的例子中这是在ViewController.swift文件中)。要与已经打开的基于 XIB 的文件并行打开它(在单击包含 class 的 swift 文件时按住 ALT/OPTION 键)和 link 来自 InterfaceBuilder 的 IBOutlet Swift 代码如下:
Third,您的实现(对于 HeaderTableView class)在 swift 文件中看起来不错,但在 [= =11=] class 需要让它在 InterfaceBuilder 中工作,只是为了给你一个例子,我在我的机器上做了一个简单的例子,我有这两个 classes 用于 TableView UIViewController 和 HeaderTableView class(都在 ViewController.swift 文件中,但如果需要,您可以将它们分成两个文件):
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource{
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
let nib = UINib(nibName: "HeaderTableView", bundle: nil)
tableView.register(nib, forHeaderFooterViewReuseIdentifier: "HeaderTableView")
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
10
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
return UITableViewCell()
}
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let view = self.tableView.dequeueReusableHeaderFooterView(withIdentifier: "HeaderTableView") as! HeaderTableView
return view
}
}
class HeaderTableView: UITableViewHeaderFooterView {
@IBOutlet weak var titleLabel: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
titleLabel.text = "Title"
}
override init(reuseIdentifier: String?) {
super.init(reuseIdentifier: reuseIdentifier)
}
required init?(coder: NSCoder) {
super.init(coder: coder)
}
}
结果我得到了这个:
不要忘记在您的 ViewController InterfaceBuilder 中将 tableView 作为委托和数据源(例如,我在 InterfaceBuilder 中的 UIViewController 在 Main.storyboard 内):
1)
2)
所以根据你的评论,如果你想添加 Table header 那么你不应该使用 XIB,因为你可以使用情节提要来实现同样的事情。它的简单和更好的方法来做到这一点。只需将 UIView 拖放到视图控制器的场景停靠栏,然后取出该视图的出口并将该视图分配给 tableheader,就像这样。
table.tableHeaderView = yourview
我将其用作 table页脚视图。
您可以从尺寸检查器调整该视图的高度。
我有一个 table,我需要在其中添加一个标题视图。我在 xib 文件中根据需要进行配置,但我在连接此视图时遇到问题。告诉我哪里做错了!
class HeaderTableView: UITableViewHeaderFooterView {
//I think in this class a mistake
override init(reuseIdentifier: String?) {
super.init(reuseIdentifier: reuseIdentifier)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
override func viewDidLoad() {
super.viewDidLoad()
let nib = UINib(nibName: "HeaderTableView", bundle: nil)
tableView.register(nib, forHeaderFooterViewReuseIdentifier: "HeaderTableView")
}
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let view = self.tableView.dequeueReusableHeaderFooterView(withIdentifier: "HeaderTableView") as! HeaderTableView
returnview
}
美好的一天, Table 视图有 5 个部分,第一部分是 tableHeaderView、SectionHeader、Cell、SectionFooter 和最后的 tableFooterView。
如果您想在表格视图的顶部添加标题,您可以使用此代码。
class HeaderTableView : UIView{
var title : UILabel = {
let label = UILabel()
label.text = "My Title"
label.translatesAutoresizingMaskIntoConstraints = false
return label
}()
override init(frame: CGRect) {
super.init(frame: frame)
setupLabel()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func setupLabel(){
addSubview(title)
NSLayoutConstraint.activate([
title.centerYAnchor.constraint(equalTo: self.centerYAnchor),
title.centerXAnchor.constraint(equalTo: self.centerXAnchor),
])
}
}
class ViewController: UITableViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
var tableHeaderView = HeaderTableView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: 200))
tableHeaderView.backgroundColor = .red
tableView.tableHeaderView = tableHeaderView
}
}
所以你提到你在 xib 文件中添加了 Header 视图,因为你想从 Interface Builder 中自由设计它。
第一件事 转到基于 XIB 的 Header 视图 (HeaderTableView.xib),在 Identity Inspector 中将 class 名称放在那里您的 Header 截至 HeaderTableView
的观点:
第二件事,打开你的HeaderTableView
swiftclass(在我的例子中这是在ViewController.swift文件中)。要与已经打开的基于 XIB 的文件并行打开它(在单击包含 class 的 swift 文件时按住 ALT/OPTION 键)和 link 来自 InterfaceBuilder 的 IBOutlet Swift 代码如下:
Third,您的实现(对于 HeaderTableView class)在 swift 文件中看起来不错,但在 [= =11=] class 需要让它在 InterfaceBuilder 中工作,只是为了给你一个例子,我在我的机器上做了一个简单的例子,我有这两个 classes 用于 TableView UIViewController 和 HeaderTableView class(都在 ViewController.swift 文件中,但如果需要,您可以将它们分成两个文件):
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource{
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
let nib = UINib(nibName: "HeaderTableView", bundle: nil)
tableView.register(nib, forHeaderFooterViewReuseIdentifier: "HeaderTableView")
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
10
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
return UITableViewCell()
}
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let view = self.tableView.dequeueReusableHeaderFooterView(withIdentifier: "HeaderTableView") as! HeaderTableView
return view
}
}
class HeaderTableView: UITableViewHeaderFooterView {
@IBOutlet weak var titleLabel: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
titleLabel.text = "Title"
}
override init(reuseIdentifier: String?) {
super.init(reuseIdentifier: reuseIdentifier)
}
required init?(coder: NSCoder) {
super.init(coder: coder)
}
}
结果我得到了这个:
不要忘记在您的 ViewController InterfaceBuilder 中将 tableView 作为委托和数据源(例如,我在 InterfaceBuilder 中的 UIViewController 在 Main.storyboard 内):
1)
2)
所以根据你的评论,如果你想添加 Table header 那么你不应该使用 XIB,因为你可以使用情节提要来实现同样的事情。它的简单和更好的方法来做到这一点。只需将 UIView 拖放到视图控制器的场景停靠栏,然后取出该视图的出口并将该视图分配给 tableheader,就像这样。
table.tableHeaderView = yourview
我将其用作 table页脚视图。
您可以从尺寸检查器调整该视图的高度。