Как программно добавить HeaderView из пера в UiTableView в Swift

ios swift uitableview uiscrollview

9948 просмотра

4 ответа

2351 Репутация автора

Ну, я наивный разработчик IOS, использующий быстрый язык.

У меня есть табличное представление, которое отображает список функций отеля. Теперь я хочу добавить информацию заголовка в tableView с изображением отеля, именем отеля над таблицей, чтобы информация заголовка также прокручивалась вместе с содержимым таблицы (список функций продукта). )

Вот проблема, TableView со списком функций работает нормально.

class HotelDetailViewController: UIViewController,UITableViewDataSource,UITableViewDelegate {

    @IBOutlet weak var categoriesTableView: UITableView!

    var items: [(String, String,String)] = [
        ("Service", "   Courteous service, Good staff , Good staff","   Bad Facility"),
        ("Vibe",  "   Courteous service, Good staff","   Bad Facility"),
        ("Hotel",  "   Courteous service, Good staff","   Bad Facility"),
        ("Room Facility",  "   Courteous service, Good staff","   Bad Facility"),
        ("Amenities",  "   Courteous service, Good staff","   Bad Facility"),
        ("Food", "   Courteous service, Good staff","   Bad Facility")
    ]


    override func viewDidLoad() {
        super.viewDidLoad()
        let nib = UINib(nibName: "HotelSnippetTableViewCell", bundle: nil)
        categoriesTableView.separatorStyle = UITableViewCellSeparatorStyle.None
        categoriesTableView.registerNib(nib, forCellReuseIdentifier: "CustomCell")
        categoriesTableView.rowHeight = UITableViewAutomaticDimension
        categoriesTableView.estimatedRowHeight = 100    
    }



    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let customTableViewCell = tableView.dequeueReusableCellWithIdentifier("CustomCell") as! HotelSnippetTableViewCell

        let info  = items[indexPath.row]

        customTableViewCell.setCategory(info.0)

        customTableViewCell.setPositive(info.1)
        customTableViewCell.setNegative(info.2)


        return customTableViewCell

    }

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

        tableView.deselectRowAtIndexPath(indexPath, animated: true)
        print("You selected cell #\(indexPath.row)!")

    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return items.count
    }


}

Для информации заголовка, такой как hotelImage, название отеля и другие метки, я создал перо со всеми установленными представлениями и соответствующий класс со всеми привязанными к нему ссылками.

Теперь, как добавить этот UiView к моему табличному представлению в качестве заголовка программно (потому что я получаю данные после вызова rest).

Я искал, но нашел учебники о том, как установить заголовки разделов строки.

Пара вещей, которые я опробовал:

  1. Я обнаружил, что есть функция протокола для TableView

    func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
           //Code}
    

Но как загрузить мое перо здесь и установить это представление таблицы, а также я хочу, чтобы это вызывалось программно только после получения данных от службы

  1. Создайте перо с родителем как TableViewCell, загрузите его с помощью dequeueReusableCellWithIdentifier (), установите информацию и установите для tableview

        let headerCell =  categoriesTableView.dequeueReusableCellWithIdentifier("HotelDetailHeaderTableViewCell") as! HotelDetailHeaderTableViewCell  headerCell.setImageUrl("");
    
        headerCell.setHotelZmi(CGFloat(87))
    
    
        headerCell.setNameAndPersona("Fort Aguada Goa", persona: "OverAll", reviewsCount: "780")
    
        headerCell.frame = CGRectMake(0, 0, self.categoriesTableView.bounds.width, 600)
    
        categoriesTableView.tableHeaderView = headerCell
    

Но даже это вызывает какое-то исключение, и я не могу увидеть, где это исключение (Как посмотреть журнал исключений в XCode?).

Правильный ли процесс, которым я занимаюсь? Если не кто-нибудь, пожалуйста, предложите мне эффективный подход

Потому что в Android я использовал для создания NestedScrollView с линейной разметкой внутри него, встроенного с любым количеством recyclerViews (без прокрутки для обзоров recycler) и Relativelayout

Помогите мне, пожалуйста.

Автор: Manikanta Источник Размещён: 19.07.2016 06:00

Ответы (4)


10 плюса

1152 Репутация автора

Решение

Вы можете использовать этот код для инициализации вашего файла пера

let view = (NSBundle.mainBundle().loadNibNamed("MenuHeader", owner: self, options: nil)[0] as? UIView)
tableView.tableHeaderView = view

Тогда ваш MenuHeader будет обычным .xib-файлом с вашей ячейкой внутри, просто не забудьте отрегулировать ограничения соответствующим образом для всех экранов, которые вы хотите.

Автор: Ramon Vasconcelos Размещён: 19.07.2016 06:11

-2 плюса

2854 Репутация автора

В вашей viewForHeaderInSectionзагрузке пользовательский вид из XIB и вернуть его

func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    // for example you have xib as 'CustomHeaderView.xib'
    let headerView = CustomView()
    headerView.myLabel.text = "My Title"

    return headerView
}

Другой метод - указание высоты заголовка.

func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 60.0 // put your height here
}
Автор: xmhafiz Размещён: 19.07.2016 06:38

4 плюса

81 Репутация автора

Обновление для Swift 4

let view = (Bundle.main.loadNibNamed("TableViewHeader", owner: self, options: nil)![0] as? UIView) 
self.tableview.tableHeaderView = view
Автор: morteza hoseinizade Размещён: 16.11.2017 09:23

1 плюс

1094 Репутация автора

Я рекомендовал бы использовать методы UITableViewDelegate для tableView ( : viewForHeaderInSection :) и tableView ( : heightForHeaderInSection :).

Затем вы можете сделать следующее:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let headerView = Bundle.main.loadNibNamed("ExampleTableHeaderView", owner: self, options: nil)?.first as? UIView
    return headerView
}

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 10
}

Другие ответы включают принудительное развертывание (!) И размещение в скобках, что не является необходимым.

Автор: Edward Размещён: 06.05.2018 10:08
Вопросы из категории :
32x32