Tôi đã thiết lập chế độ xem bảng với các liên kết nguồn và dữ liệu chính xác .. phương thức reloadData gọi nguồn dữ liệu và phương thức ủy nhiệm ngoại trừ viewForHeaderInSection:
.
Tại sao lại như vậy?
sectionHeaderHeight
chưa?
Tôi đã thiết lập chế độ xem bảng với các liên kết nguồn và dữ liệu chính xác .. phương thức reloadData gọi nguồn dữ liệu và phương thức ủy nhiệm ngoại trừ viewForHeaderInSection:
.
Tại sao lại như vậy?
sectionHeaderHeight
chưa?
Câu trả lời:
Việc sử dụng tableView:viewForHeaderInSection:
đòi hỏi bạn cũng phải thực hiện tableView:heightForHeaderInSection:
. Điều này sẽ trả về một chiều cao khác không thích hợp cho tiêu đề. Ngoài ra hãy chắc chắn rằng bạn không còn thực hiện tableView:titleForHeaderInSection:
. Bạn chỉ nên sử dụng cái này hoặc cái kia ( viewForHeader
hoặc titleForHeader
).
numberOfSections
.
titleForHeaderInSection:
và viewForHeaderInSection:
chế độ xem được trả về từ sau là một lớp con UITableViewHeaderFooterView
thì nó textLabel.text
sẽ tự động được đặt thành phiên bản toàn titleForHeaderInSection:
chuỗi của chuỗi. Để ngăn chặn hành vi này, không thực hiện titleForHeaderInSection:
hoặc sử dụng nhãn tùy chỉnh thay vì kế thừa textLabel
.
Bí quyết là hai phương thức đó thuộc về các UITableView
giao thức khác nhau : tableView:titleForHeaderInSection:
là một UITableViewDataSource
phương thức giao thức, tableView:viewForHeaderInSection
thuộc về UITableViewDelegate
.
Điều đó có nghĩa là:
Nếu bạn thực hiện các phương thức nhưng chỉ gán cho mình như là
dataSource
cho UITableView
, tableView:viewForHeaderInSection
việc thực hiện của bạn
sẽ bị bỏ qua.
tableView:viewForHeaderInSection
có mức độ ưu tiên cao hơn. Nếu bạn thực hiện cả hai phương pháp và gán cho mình là cả hai
dataSource
và delegate
cho UITableView
, bạn sẽ trở lại quan điểm cho phần tiêu đề nhưng bạn
tableView:titleForHeaderInSection:
sẽ bị bỏ qua.
Tôi cũng đã thử loại bỏ tableView:heightForHeaderInSection:
; nó hoạt động tốt và dường như không ảnh hưởng đến các thủ tục trên. Nhưng tài liệu nói rằng nó là cần thiết tableView:viewForHeaderInSection
để hoạt động chính xác; Vì vậy, để an toàn, tốt nhất là thực hiện điều này.
UITableViewDelegate
cho self
, bởi vì tôi nghĩ, đó tableView:viewForHeaderInSection
là một UITableViewDataSource
phương pháp. Cảm ơn bạn!
titleForHeader
có kích thước nội tại. Kích thước nội tại được tính toán dựa trên Họ phông chữ và kích thước.
@rmaddy đã khai sai nguyên tắc, hai lần: trong thực tế, tableView:viewForHeaderInSection:
không không yêu cầu bạn cũng thực hiện tableView:heightForHeaderInSection:
, và cũng có thể nó là hoàn toàn tốt đẹp để gọi cả titleForHeader
và viewForHeader
. Tôi sẽ nêu chính xác quy tắc chỉ cho hồ sơ:
Quy tắc đơn giản là viewForHeader
sẽ không được gọi trừ khi bạn bằng cách nào đó cho chiều cao của tiêu đề. Bạn có thể làm điều này theo bất kỳ cách nào trong ba cách:
Thực hiện tableView:heightForHeaderInSection:
.
Đặt bảng của sectionHeaderHeight
.
Gọi titleForHeader
(điều này bằng cách nào đó cung cấp cho tiêu đề một chiều cao mặc định nếu nó không có chiều cao khác).
Nếu bạn không làm những điều đó, bạn sẽ không có tiêu đề và viewForHeader
sẽ không được gọi. Đó là bởi vì không có chiều cao, bộ thực thi sẽ không biết cách thay đổi kích thước khung nhìn, do đó, không cần phải hỏi một cái.
tableView:viewForHeaderInSection:
: "Phương pháp này chỉ hoạt động chính xác khi tableView:heightForHeaderInSection:
cũng được thực hiện.".
titleForHeaderInSection
và viewForHeaderInSection
? Chế độ xem bảng sẽ chỉ gọi một trong hai (tôi quên mất quyền ưu tiên tại thời điểm này).
viewForHeader
được gọi mà không có bất kỳ cách nào trong ba cách gán chiều cao đó. Tôi đã có điều này xảy ra, nơi tôi viewForHeader
được gọi và tiêu đề xuất hiện tốt, cho đến một ngày, không có thay đổi về phía tôi, họ đã không làm . Đó là khi tôi bắt đầu thử nghiệm để khám phá những yêu cầu tối thiểu viewForHeader
được gọi là gì. Và bây giờ tôi biết. Và bây giờ bạn cũng vậy.
Đưa ra estimatedSectionHeaderHeight
và sectionHeaderHeight
các giá trị đã khắc phục vấn đề của tôi. ví dụ,
self.tableView.estimatedSectionHeaderHeight = 100
self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension
Từ bỏ câu trả lời của rmaddy, tôi đã cố gắng ẩn chế độ xem Tiêu đề và đang trả về 0,0f cho "tableView: heightForHeaderInSection" và 0 height View from tableView:viewForHeaderInSection
.
Sau khi thay đổi từ return 1.0f
thành return 0.0f
trong tableView:heightForHeaderInSection
, phương thức đại biểu tableView:viewForHeaderInSection
thực sự được gọi.
Hóa ra hiệu ứng mong muốn của tôi hoạt động mà không phải sử dụng "tableView: heightForHeaderInSection"; nhưng điều này có thể hữu ích cho những người khác đang gặp vấn đề khi nhận được phương thức ủy nhiệm "tableView: heightForHeaderInSection".
Bạn nên thực hiện tableView:heightForHeaderInSection:
và đặt chiều cao cho tiêu đề> 0.
Phương thức ủy nhiệm này đi cùng với viewForHeaderInSection:
phương thức.
Tôi hi vọng cái này giúp được.
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
return 40;
}
Đáng lưu ý ngắn gọn rằng nếu bạn thực hiện tableView:heightForHeaderInSection:
trả lại UITableViewAutomaticDimension
, thì tableView:viewForHeaderInSection:
sẽ không được gọi.
UITableViewAutomaticDimension
giả định rằng một tiêu chuẩn UITableViewHeaderFooterView
sẽ được sử dụng được áp dụng với phương thức ủy nhiệm tableView:titleForHeaderInSection:
.
Từ ý kiến trong UITableView.h
:
Trả lại giá trị này từ
tableView:heightForHeaderInSection:
hoặctableView:heightForFooterInSection:
dẫn đến chiều cao phù hợp với giá trị được trả về từtableView:titleForHeaderInSection:
hoặctableView:titleForFooterInSection:
nếu tiêu đề không bằng không.
estimatedSectionHeaderHeight
thành một giá trị nào đó, tableView:viewForHeaderInSection
sẽ được gọi (tương tự như cách kích thước tự động cho các hàng hoạt động)
Tôi vừa gặp sự cố với các tiêu đề không hiển thị cho iOS 7.1 , nhưng hoạt động tốt với các bản phát hành sau mà tôi đã thử nghiệm, rõ ràng với 8.1 và 8.4.
Đối với cùng một mã, 7.1 không gọi bất kỳ phương thức ủy nhiệm tiêu đề nào cả, bao gồm: tableView:heightForHeaderInSection:
vàtableView:viewForHeaderInSection:
.
Sau khi thử nghiệm, tôi thấy rằng việc xóa dòng này khỏi viewDidLoad
các tiêu đề đã tạo của tôi sẽ xuất hiện lại cho 7.1 và không ảnh hưởng đến các phiên bản khác mà tôi đã thử nghiệm:
// _Removing_ this line _fixed_ headers on 7.1
self.tableView.estimatedSectionHeaderHeight = 80;
Vì vậy, dường như có một số loại xung đột ở đó cho 7.1, ít nhất.
Vấn đề tương tự xảy ra với tôi nhưng khi tôi đang sử dụng tính toán chiều cao tự động từ xCode 9 , tôi không thể đưa ra bất kỳ giá trị chiều cao rõ ràng nào như đã đề cập ở trên. Sau một số thử nghiệm tôi đã có giải pháp , chúng ta phải ghi đè phương thức này như,
-(CGFloat)tableView:(UITableView *)tableView
estimatedHeightForHeaderInSection:(NSInteger)section
{
return 44.0f;
}
Mặc dù tôi đã kiểm tra cả hai tùy chọn
từ bảng phân cảnh như apple nói, nhưng tôi vẫn gặp phải lỗi kỳ lạ này.
Xin lưu ý : Lỗi này chỉ được hiển thị trên phiên bản IOS-10 chứ không phải trên phiên bản iOS-11 . Có lẽ đó là một lỗi từ xCode. Cảm ơn
Đây là những gì tôi đã tìm thấy ( Swift 4 ) (nhờ nhận xét này về một câu hỏi khác)
Cho dù tôi đã sử dụng titleForHeaderInSection hay viewForHeaderInSection - không phải là họ không được gọi khi chế độ xem bảng được cuộn và các ô mới đang được tải, nhưng bất kỳ lựa chọn phông chữ nào tôi thực hiện cho textLabel của tiêu đề chỉ xuất hiện trên những gì ban đầu hiển thị khi tải , và không phải như bảng đã được cuộn.
Bản sửa lỗi là 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)
}
}
Trong trường hợp của tôi, tôi đã tạo chế độ xem tiêu đề bằng cách sử dụng UITableviewCell
và trả lại ô viewForHeaderInSection
như thế này
return cell
đã thay đổi điều này thành
return cell.contentView
Đã làm cho tôi.
Trong trường hợp của tôi
viewForHeaderInSection
đã được thực hiện trong một lớp dẫn xuất ở xa mà không bận tâm đến việc chuyển thành siêu lớp.
Lý do tại sao viewForHeaderInSection
không được gọi là vì một trong hai lý do:
Hoặc bạn đã không thiết lập UITableViewDelegate
hoặc bạn thiết lập UITableViewDelegate
không chính xác.
Trong trường hợp của tôi, đó là lý do tôi đã không thực hiện:
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
Tôi đã cắt và dán hai phương thức sau từ dự án Swift 2 vào dự án Swift 3 không bao giờ được gọi vì trong Swift 3, các phương thức này phải có "-" trước tên tham số đầu tiên.
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:
thực hiện?