Đối với bất kỳ ai muốn ẩn phần vì họ đang sử dụng bảng được nhóm tĩnhXem số lượng động, giải pháp dưới đây có thể trợ giúp. Trong trường hợp của tôi, mỗi phần có dữ liệu cần hiển thị để có tiêu đề tùy chỉnh. Bất kỳ phần nào không có dữ liệu, cần được ẩn hoàn toàn.
Câu trả lời ở trên là sự trợ giúp tuyệt vời trong kịch bản của tôi. Tuy nhiên, đối với những người không phải lúc nào cũng biết phần nào sẽ cần được ẩn ở đây là giải pháp cho bạn mở rộng ở trên.
Trong trường hợp của mình, tôi có tối đa 12 mục nhập trong một mảng mà tôi muốn hiển thị trong tối đa 12 mục (trong số các phần khác trong bảng được nhóm). Nếu có ít hơn 12 mục để hiển thị, tôi muốn ẩn các phần không cần thiết bằng cách cho chúng 0 chiều cao và 0 hàng. Tôi cũng muốn ẩn headerView.
Để làm điều này, tôi đã làm như sau:
- Thiết lập tableView của bạn theo câu trả lời tuyệt vời @sasquatch đã trên.
- Trong phần numberOfRowsInSection (phần: Int) và tableView (_ tableView: UITableView, heightForHeaderInSection phần: Int) chức năng, kiểm tra xem các hàng/chiều cao nên là 0.
Trong trường hợp của tôi, tôi đã sử dụng phần 1-12 cho dữ liệu động của tôi vì vậy tôi đã sử dụng mã như dưới đây:
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
//For section 0 and 13, just 1 row is ok
if section == 0 || section == 13 {
return 1
}
//For sections 1 - 12, determine if we have data to populate it, or if we should hide it
if section <= dynamicDataToDisplay.count {
return 2
}
//If it's section 1 - 12, but we don't have a corresponding data entry in dynamicDataToDisplay, then just return 0 rows
return 0
}
Mã cho chức năng heightForHeader cũng tương tự như trong logic:
override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
switch section {
case 0:
return 45.0
case 13:
return UITableViewAutomaticDimension
default:
if dynamicDataToDisplay.count >= section {
return 25.0
} else {
return 0.0
}
} //end switch
}
Ngay cả sau khi thiết lập các chức năng này, tôi thấy rằng tôi vẫn nhận được tiêu đề xuất hiện cho các phần tôi muốn ẩn. Tôi đoán tôi nghĩ rằng viewForHeaderInSection sẽ không được gọi nếu numberOfRows là 0 và heightOfHeader cũng là 0, nhưng nó vẫn đang được gọi.
Thêm những điều sau đây giúp đảm bảo rằng các tiêu đề không cần thiết tạo:
override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
//set up header for dynamic data sections
if 1 ... 12 ~= section {
if tableView.numberOfRows(inSection: section) == 0 {
return nil
}
//Continue with the header set up for valid sections with rows to display data
......
}
}
Giải pháp này có thể giúp đỡ bất cứ ai vẫn còn nhận được một tiêu đề được tạo ra mặc dù chiều cao và các hàng của nó được thiết lập là 0.
Điều gì xảy ra nếu TableView là tĩnh (một vài mã cứng khác với mỗi hàng khác, như cửa sổ cài đặt)? – Josh
Kể từ Xcode 7.3, Swift 2.2: thay thế cho 'tableView (_: heightForHeaderInSection)', bạn cũng có thể ghi đè 'tableView (_: titleForHeaderInSection)' và trả về 'nil' khi bạn muốn ẩn tiêu đề. Sau đó, chiều cao của phần heder sẽ được điều chỉnh tự động thành 0 để không hiển thị văn bản. – maganap
Ẩn các hàng và thiết lập các hàng là chiều cao 0 đã gây ra các vấn đề với các ràng buộc của tôi. Câu trả lời này cố định rằng, giải pháp tốt đẹp! –