从.xib文件中创建表头视图

3

我有一个表格,需要添加标题视图。我在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
        }

你想要为所有的TableView添加标题吗? - cristian_064
@luffy_064 是的! - JiosDev
当从xib创建视图时,通常使用init(coder:)初始化器。如果它们是空的,为什么还要定义初始化器?你会得到什么错误? - Sulthan
是表头还是章节标题? - CrackIt
@CrackIt,我的类有点错了。我需要将现有视图连接到表头视图的位置,而不是节头。 - JiosDev
3个回答

10

你提到你在xib文件中添加了你的Header视图,因为你想要从Interface Builder中自由设计它。

第一步进入基于XIB的Header View(HeaderTableView.xib),在Identity Inspector中将您的Header View的类名设置为HeaderTableView

第二步打开您的HeaderTableView swift类(在我的示例中,它位于ViewController.swift文件中)。在已经打开的基于XIB的文件中并行打开(同时按住ALT/OPTION键单击包含该类的swift文件),像这样将IBOutlet从Interface Builder链接到Swift代码:

第三步,您的实现(对于HeaderTableView类)在swift文件中看起来很好,但需要在HeaderTableView类中做出小的调整才能使其从Interface Builder中工作,只是为了给您一个例子,我在我的机器上制作了一个简单的示例,我有两个类用于TableView UIViewController和HeaderTableView类(都在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设置为delegate和dataSource (例如, 我的UIViewController在Main.storyboard中):

1)

2)


谢谢,但我在viewForHeaderInSection方法中遇到了一个错误。这个"从UITableViewHeaderFooterView?转换为不相关的类型HeaderTableView总是失败",出现在代码中的一行let view = self.tableView .... - JiosDev
如果你按照我的指示一步一步地操作,你应该能够像我一样构建一个工作样例,并向你展示截图。仔细看看,也许你错过了什么! - denis_lor

3

根据您的评论,如果您想要添加表头,则不应使用XIB,因为您可以使用Storyboard实现相同的功能。 这是一种更简单和更好的方法。 只需将UIView拖放到视图控制器的场景窗口中,并获取该视图的outlet,然后将该视图分配给tableheader,如下所示。

table.tableHeaderView = yourview

在此输入图片描述

我将其用作表视图的页脚视图。

您可以使用大小检查器来调整该视图的高度。


太棒了!比xibs好多了! - sold

1

你好, TableView有5个部分,第一部分是tableHeaderView,SectionHeader,Cell,SectionFooter和最后的tableFooterView。

如果你想在TableView顶部添加标题,可以使用以下代码。

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
    }



}

enter image description here


1
你的答案很好,但是你创建了一个视图(给它背景的大小和颜色),而我已经有一个视图,需要将它连接到你的红色视图的位置。 - JiosDev
你可以通过代码或.xib创建视图,但我建议使用tableheaderview为tableView添加标题,而不是使用section Header,因为这样你可以在一个tableView中拥有多个HeaderSection。 - cristian_064

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接