如何在Swift中以编程方式将HeaderView从nib添加到UiTableView

时间:2016-07-19 06:00:22

标签: ios swift uitableview uiscrollview

我是一个使用swift语言的天真的IOS开发人员。

我有一个表格视图,其中显示了酒店的功能列表。现在我想在tableView上添加一个标题信息,其中包含酒店图片,酒店名称在tableview上方,以便标题信息也与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,酒店名称和其他标签这样的标题信息,我创建了一个包含所有视图集的nib,以及一个映射到它的所有引用的相应类。

现在如何以编程方式将此UiView作为标题添加到我的tableview中(因为我在休息调用后获取数据)。

我已经搜索过,但找到了有关如何设置字符串节标题的教程。

我试过了几件事:

  1. 我发现TableView有一个协议功能

    func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
           //Code}
    
  2. 但是如何在这里加载我的笔尖并设置为此tableview,并且我希望只有在从服务获取数据后才以编程方式触发

    1. 使用parent作为TableViewCell创建一个nib,使用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
      
    2. 但即使这是抛出一些异常,我也看不到异常的位置(如何在Xcode中查看异常日志?)。

      我正在做的过程是否正确?如果没有人请建议我有效的方法

      因为在Android中我曾经创建过一个内嵌线性布局的NestedScrollView,它嵌入了任意数量的recyclerViews(删除了recyclelerviews的滚动)和Relativelayout

      请帮助我。

4 个答案:

答案 0 :(得分:10)

您可以使用此代码初始化您的nib文件

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

然后您的MenuHeader将是一个普通的.xib文件,其中包含您的单元格,只需记住适当调整约束以适合您想要的所有屏幕。

答案 1 :(得分:4)

更新swift 4

let view = (Bundle.main.loadNibNamed("TableViewHeader", owner: self, options: nil)![0] as? UIView) 
self.tableview.tableHeaderView = view

答案 2 :(得分:0)

我建议使用tableView(:viewForHeaderInSection :)和tableView(:heightForHeaderInSection :)的UITableViewDelegate方法。

然后您可以执行以下操作:

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
}

其他答案涉及强行展开(!)并放在括号中,这是不必要的。

答案 3 :(得分:-2)

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
}