我是一个使用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中(因为我在休息调用后获取数据)。
我已经搜索过,但找到了有关如何设置字符串节标题的教程。
我试过了几件事:
我发现TableView有一个协议功能
func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
//Code}
但是如何在这里加载我的笔尖并设置为此tableview,并且我希望只有在从服务获取数据后才以编程方式触发
使用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
但即使这是抛出一些异常,我也看不到异常的位置(如何在Xcode中查看异常日志?)。
我正在做的过程是否正确?如果没有人请建议我有效的方法
因为在Android中我曾经创建过一个内嵌线性布局的NestedScrollView,它嵌入了任意数量的recyclerViews(删除了recyclelerviews的滚动)和Relativelayout
请帮助我。
答案 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
}