ฉันได้ตั้งค่า tableview ที่ถูกต้องกับผู้ร่วมประชุมและแหล่งข้อมูลความเชื่อมโยง .. วิธี reloadData viewForHeaderInSection:
เรียกแหล่งข้อมูลและวิธีการผู้รับมอบสิทธิ์ยกเว้น
เหตุผลที่เป็นเช่นนั้น?
sectionHeaderHeight
หรือยัง?
ฉันได้ตั้งค่า tableview ที่ถูกต้องกับผู้ร่วมประชุมและแหล่งข้อมูลความเชื่อมโยง .. วิธี reloadData viewForHeaderInSection:
เรียกแหล่งข้อมูลและวิธีการผู้รับมอบสิทธิ์ยกเว้น
เหตุผลที่เป็นเช่นนั้น?
sectionHeaderHeight
หรือยัง?
คำตอบ:
การใช้ต้องให้คุณยังดำเนินการtableView:viewForHeaderInSection:
tableView:heightForHeaderInSection:
สิ่งนี้ควรส่งคืนความสูงที่ไม่ใช่ศูนย์ที่เหมาะสมสำหรับส่วนหัว ตรวจสอบให้แน่ใจว่าคุณไม่ได้ใช้ไฟล์tableView:titleForHeaderInSection:
. คุณควรใช้เพียงอย่างใดอย่างหนึ่ง ( viewForHeader
หรือtitleForHeader
)
numberOfSections
นอกจากนี้ยังให้แน่ใจว่าคุณจะกลับมาจาก 0
titleForHeaderInSection:
และviewForHeaderInSection:
และมุมมองที่ส่งกลับจากหลังเป็นคลาสย่อยจากUITableViewHeaderFooterView
นั้นมันtextLabel.text
จะถูกตั้งค่าเป็นtitleForHeaderInSection:
สตริงทั้งหมดโดยอัตโนมัติ เพื่อป้องกันไม่ให้ปัญหานี้อย่างใดอย่างหนึ่งไม่ได้ใช้หรือใช้ฉลากที่กำหนดเองแทนการรับมรดกtitleForHeaderInSection:
textLabel
เคล็ดลับคือว่าทั้งสองวิธีการที่แตกต่างกันเป็นUITableView
โปรโตคอล: tableView:titleForHeaderInSection:
เป็นUITableViewDataSource
วิธีการโปรโตคอลที่เป็นtableView:viewForHeaderInSection
UITableViewDelegate
นั่นหมายความว่า:
หากคุณใช้วิธีการ แต่กำหนดตัวเองเป็น
dataSource
สำหรับวิธีการUITableView
เท่านั้นtableView:viewForHeaderInSection
การใช้งานของคุณ
จะถูกละเว้น
tableView:viewForHeaderInSection
มีลำดับความสำคัญสูงกว่า หากคุณใช้ทั้งสองวิธีและกำหนดตัวเองเป็นทั้งสอง
dataSource
และdelegate
สำหรับวิธีUITableView
นี้คุณจะส่งคืนมุมมองสำหรับส่วนหัวของส่วน แต่คุณ
tableView:titleForHeaderInSection:
จะถูกเพิกเฉย
ฉันได้ลองลบtableView:heightForHeaderInSection:
แล้วด้วย มันใช้งานได้ดีและดูเหมือนจะไม่มีผลกับขั้นตอนข้างต้น แต่เอกสารระบุว่าจำเป็นสำหรับการtableView:viewForHeaderInSection
ทำงานอย่างถูกต้อง ดังนั้นเพื่อความปลอดภัยจึงควรใช้สิ่งนี้เช่นกัน
UITableViewDelegate
ให้self
เพราะคิดว่าtableView:viewForHeaderInSection
เป็นUITableViewDataSource
วิธีการ ขอบคุณ!
titleForHeader
ซึ่งมีขนาดที่แท้จริง ขนาดที่แท้จริงคำนวณตามตระกูลฟอนต์และขนาด
@rmaddy ได้ misstated กฎครั้งที่สอง: ในความเป็นจริงtableView:viewForHeaderInSection:
ไม่ได้ต้องการให้คุณยังดำเนินการtableView:heightForHeaderInSection:
และยังเป็นดีอย่างสมบูรณ์แบบที่จะเรียกทั้งสองและtitleForHeader
viewForHeader
ฉันจะระบุกฎอย่างถูกต้องสำหรับบันทึก:
กฎเป็นเพียงที่viewForHeader
จะไม่ถูกเรียกเว้นแต่คุณจะให้ส่วนหัวมีความสูง คุณสามารถทำได้สามวิธีรวมกัน:
tableView:heightForHeaderInSection:
Implement
sectionHeaderHeight
การตั้งค่าของตาราง
โทรtitleForHeader
(สิ่งนี้จะทำให้ส่วนหัวมีความสูงเริ่มต้นหากไม่มี)
หากคุณไม่ทำสิ่งเหล่านั้นคุณจะไม่มีส่วนหัวและviewForHeader
จะไม่ถูกเรียก นั่นเป็นเพราะหากไม่มีความสูงรันไทม์จะไม่ทราบวิธีปรับขนาดมุมมองดังนั้นจึงไม่ต้องขออย่างใดอย่างหนึ่ง
tableView:viewForHeaderInSection:
: "วิธีนี้ใช้ได้ผลtableView:heightForHeaderInSection:
ก็ต่อเมื่อมีการนำไปใช้ด้วย"
titleForHeaderInSection
และได้viewForHeaderInSection
อย่างไร? มุมมองตารางจะเรียกหนึ่งในสองเท่านั้น (ฉันลืมว่าสิ่งใดมีความสำคัญในขณะนี้)
viewForHeader
ถูกเรียกโดยไม่ต้องกำหนดความสูงสามวิธี ฉันมีเรื่องนี้เกิดขึ้นที่ฉันviewForHeader
ถูกเรียกตัวและส่วนหัวปรากฏตัวขึ้นได้ดีจนกระทั่งวันหนึ่งมีการเปลี่ยนแปลงในส่วนของฉันไม่มีพวกเขาไม่ได้ นั่นคือตอนที่ฉันเริ่มทดลองเพื่อค้นหาความต้องการขั้นต่ำviewForHeader
ที่เรียกว่าอะไร และตอนนี้ฉันรู้แล้ว และตอนนี้คุณก็เช่นกัน
การให้estimatedSectionHeaderHeight
และsectionHeaderHeight
ค่าต่างๆช่วยแก้ปัญหาของฉันได้ เช่น,
self.tableView.estimatedSectionHeaderHeight = 100
self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension
จะปิด rmaddy คำตอบของผมก็พยายามที่จะซ่อนมุมมองส่วนหัวและกำลังจะกลับ 0.0f สำหรับ 'tableView: heightForHeaderInSection' และ 0 tableView:viewForHeaderInSection
สูงมุมมองจาก
หลังจากเปลี่ยนจากreturn 1.0f
เป็นreturn 0.0f
ในtableView:heightForHeaderInSection
วิธีการมอบหมายtableView:viewForHeaderInSection
ได้ถูกเรียกอย่างแท้จริง
ปรากฎว่าเอฟเฟกต์ที่ฉันต้องการใช้งานได้โดยไม่ต้องใช้ "tableView: heightForHeaderInSection"; แต่อาจเป็นประโยชน์สำหรับผู้อื่นที่มีปัญหาในการเรียกเมธอดผู้แทน "tableView: heightForHeaderInSection"
คุณควรใช้tableView:heightForHeaderInSection:
และตั้งค่าความสูงสำหรับส่วนหัว> 0
วิธีการมอบหมายนี้ไปพร้อมกับviewForHeaderInSection:
วิธีการ
ฉันหวังว่านี่จะช่วยได้.
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
return 40;
}
เป็นที่น่าสังเกตสั้น ๆ ว่าหากคุณดำเนินการตามtableView:heightForHeaderInSection:
ผลตอบแทนUITableViewAutomaticDimension
แล้วtableView:viewForHeaderInSection:
จะไม่ถูกเรียก
UITableViewAutomaticDimension
สันนิษฐานว่าเป็นมาตรฐานที่จะใช้ว่าเป็นประชากรที่มีวิธีการมอบหมายUITableViewHeaderFooterView
tableView:titleForHeaderInSection:
จากความคิดเห็นในUITableView.h
:
การส่งคืนค่านี้จาก
tableView:heightForHeaderInSection:
หรือtableView:heightForFooterInSection:
ผลลัพธ์เป็นความสูงที่พอดีกับค่าที่ส่งกลับจากtableView:titleForHeaderInSection:
หรือtableView:titleForFooterInSection:
ถ้าชื่อเรื่องไม่ใช่ศูนย์
estimatedSectionHeaderHeight
เป็นค่าบางค่าtableView:viewForHeaderInSection
จะถูกเรียก (คล้ายกับการทำงานของขนาดอัตโนมัติสำหรับแถว)
ฉันเพิ่งมีปัญหากับส่วนหัวที่ไม่แสดงสำหรับiOS 7.1แต่ทำงานได้ดีกับรุ่นที่ใหม่กว่าที่ฉันได้ทดสอบอย่างชัดเจนกับ 8.1 และ 8.4
สำหรับรหัสเดียวกัน 7.1 ไม่ได้เรียกใช้เมธอดการมอบหมายส่วนหัวส่วนใดเลยรวมถึง: tableView:heightForHeaderInSection:
และtableView:viewForHeaderInSection:
.
หลังจากการทดลองฉันพบว่าการลบบรรทัดนี้ออกจากviewDidLoad
ส่วนหัวที่สร้างขึ้นของฉันปรากฏขึ้นอีกครั้งสำหรับ 7.1 และไม่ส่งผลกระทบต่อเวอร์ชันอื่นที่ฉันทดสอบ:
// _Removing_ this line _fixed_ headers on 7.1
self.tableView.estimatedSectionHeaderHeight = 80;
…ดังนั้นดูเหมือนว่าจะมีข้อขัดแย้งบางอย่างสำหรับ 7.1 เป็นอย่างน้อย
เกิดปัญหาเดียวกันกับฉัน แต่เนื่องจากฉันใช้การคำนวณความสูงอัตโนมัติจากxCode 9ฉันจึงไม่สามารถให้ค่าความสูงที่ชัดเจนตามที่กล่าวไว้ข้างต้นได้ หลังจากการทดลองบางอย่างฉันได้วิธีแก้ปัญหาเราต้องแทนที่วิธีนี้เป็น
-(CGFloat)tableView:(UITableView *)tableView
estimatedHeightForHeaderInSection:(NSInteger)section
{
return 44.0f;
}
แม้ว่าฉันได้ตรวจสอบทั้งสองตัวเลือกแล้ว
จากสตอรี่บอร์ดตามที่ Apple บอก แต่ฉันก็ยังพบข้อผิดพลาดแปลก ๆ นี้
หมายเหตุ : ข้อผิดพลาดนี้ก็แสดงให้เห็นเฉพาะในIOS-10รุ่นที่ไม่ได้อยู่บนIOS-11รุ่น อาจจะเป็นบั๊กจาก xCode ขอบคุณ
นี่คือสิ่งที่ฉันพบ ( Swift 4 ) (ขอบคุณความคิดเห็นนี้สำหรับคำถามอื่น)
ไม่ว่าฉันจะใช้ titleForHeaderInSection หรือ viewForHeaderInSection - ไม่ใช่ว่าพวกเขาไม่ได้รับการเรียกใช้เมื่อมีการเลื่อน tableview และเซลล์ใหม่กำลังโหลด แต่ตัวเลือกแบบอักษรใด ๆ ที่ฉันทำสำหรับ textLabel ของ headerView จะปรากฏเฉพาะในสิ่งที่มองเห็นได้ในตอนแรกเมื่อโหลดเท่านั้น และไม่ใช่ตามที่ตารางถูกเลื่อน
การแก้ไขคือ willDisplayHeaderView:
func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
if let header = view as? UITableViewHeaderFooterView {
header.textLabel?.font = UIFont(name: yourFont, size: 42)
}
}
ในกรณีของฉันฉันได้สร้างมุมมองส่วนหัวโดยใช้UITableviewCell
และส่งคืนเซลล์ในviewForHeaderInSection
ลักษณะนี้
return cell
เปลี่ยนสิ่งนี้เป็น
return cell.contentView
ทำงานให้ฉัน
ในกรณีของฉัน
viewForHeaderInSection
ถูกนำไปใช้ในคลาสที่ได้รับมาซึ่งอยู่ห่างไกลออกไปซึ่งไม่รบกวนเดซี่เข้าสู่ซูเปอร์คลาส
สาเหตุที่viewForHeaderInSection
ไม่ถูกเรียกนั้นมาจากหนึ่งในสองเหตุผล:
คุณไม่ได้ตั้งค่าของคุณUITableViewDelegate
หรือคุณตั้งค่าUITableViewDelegate
ไม่ถูกต้อง
ในกรณีของฉันมันเป็นสาเหตุที่ฉันไม่ได้ใช้:
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
บางครั้งการตั้งค่าtableview.delegate
หรือdatasource = nil
ในviewWillAppear:
หรือviewDidAppear:
วิธีการอาจทำให้เกิดปัญหานี้ อย่าทำแบบนี้ ...
ฉันได้ตัดและวางสองวิธีต่อไปนี้จากโปรเจ็กต์ Swift 2 ลงในโปรเจ็กต์ Swift 3 ของฉันซึ่งไม่เคยถูกเรียกเพราะใน Swift 3 วิธีการเหล่านี้ต้องมี "-" ก่อนชื่อพารามิเตอร์ตัวแรก
func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return 44.0
}
func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let headerView = tableView.dequeueReusableHeaderFooterView(withIdentifier: B2BTrolleyHeaderFooterView.reuseIdentifier) as! B2BTrolleyHeaderFooterView
return headerView
}
heightForHeaderInSection:
การดำเนินการ?