Вид заголовка таблицы из .xib - PullRequest
2 голосов
/ 16 марта 2020

У меня есть таблица, в которую мне нужно добавить вид заголовка. Я сделал это в 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
        }

Ответы [ 3 ]

4 голосов
/ 16 марта 2020

Итак, вы упомянули, что добавили представление Header в xib-файл, поскольку вы хотели свободно создавать его из Interface Builder.

Первым делом go для вашего представления заголовка на основе XIB (HeaderTableView.xib) в Identity Inspector и поместите имя класса вашего представления заголовка с HeaderTableView:

image

Вторая вещь , откройте свой HeaderTableView swift класс (в моем примере это в файле ViewController.swift). Чтобы открыть его параллельно с уже открытым файлом на основе XIB (удерживайте нажатой клавишу ALT / OPTION, пока вы нажимаете на файл swift, содержащий этот класс), и свяжите свой IBOutlet из InterfaceBuilder с кодом Swift следующим образом:

image

В-третьих , ваша реализация (для класса HeaderTableView) выглядит хорошо в файле swift, но для его работы из InterfaceBuilder необходимы небольшие изменения в классе HeaderTableView, просто чтобы приведу пример того, что я сделал на своем компьютере, чтобы сделать простой пример. У меня есть два класса для 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)
    }
}

И в результате у меня есть это :

image

Не забудьте в вашем ViewController InterfaceBuilder сделать tableView как делегат и источник данных (мой UIViewController в InterfaceBuilder находится в Main.storyboard, например):

1)

* 1 036 *

2)

image

1 голос
/ 16 марта 2020

Так что, согласно вашему комментарию, если вы хотите добавить заголовок таблицы, вам не следует использовать XIB, потому что вы можете добиться того же с помощью раскадровки. Это простой и лучший способ сделать это. Просто перетащите UIView в док сцены вашего контроллера представления и возьмите выход этого представления и назначьте это представление для заголовка таблицы следующим образом.

table.tableHeaderView = yourview

enter image description here

Я использовал его как просмотр нижнего колонтитула таблицы.

Вы можете отрегулировать высоту этого представления из инспектора размера.

0 голосов
/ 16 марта 2020

Добрый день, табличное представление состоит из 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
    }



}

enter image description here

...