Swift中自定义Table View Cell仅显示顶部内容问题求助
Swift自定义TableViewCell显示异常问题求助
我在Swift开发中遇到了自定义TableViewCell的显示问题:用于展示餐厅营业时间的cell仅显示顶部内容,只有周日的营业时间可见,其余日期的内容无法正常显示。该cell的选择逻辑由单独文件中的switch-case语句控制,承载该cell的ViewController通过代码跳转呈现(未直接关联Main.storyboard)。
我已经排查了以下内容:
- 确认自定义TableViewCell的.xib文件中高度设置正确;
- 确认Identity inspector中自定义类、Module设置正确,且勾选了Inherit Module From Target;
- 确认Attributes inspector中Style设为Custom,且Identifier正确。
问题仍未解决,附上相关代码,请求帮助。
相关代码
CitiesRestaurantsResultsViewController.swift
//*包含TableView的ViewController代码* func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { //以TableView形式展示详情页 let storyboard = UIStoryboard(name: "Main", bundle: nil) let scrollableCitiesRestaurantDetailsVC = storyboard.instantiateViewController(identifier: "ScrollableCitiesRestaurantDetailsViewController") as! ScrollableCitiesRestaurantDetailsViewController scrollableCitiesRestaurantDetailsVC.modalPresentationStyle = .fullScreen scrollableCitiesRestaurantDetailsVC.modalTransitionStyle = .crossDissolve scrollableCitiesRestaurantDetailsVC.venues = venues[indexPath.row] navigationController?.pushViewController(scrollableCitiesRestaurantDetailsVC, animated: true) } //*该ViewController文件其余代码为无关扩展和类定义*
ScrollableCitiesRestaurantDetailsViewController.swift
import UIKit //*更多导入语句* class ScrollableCitiesRestaurantDetailsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { @IBOutlet var scrollableCitiesRestaurantDetailsTableView: UITableView! override func viewDidLoad() { super.viewDidLoad() //*注册该TableView使用的自定义cell代码* scrollableCitiesRestaurantDetailsTableView.delegate = self scrollableCitiesRestaurantDetailsTableView.dataSource = self //*从API获取数据的代码* } //*该TableView的其他通用代码* func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 11 } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { if indexPath.row == 0 { //*此处为该cell的代码* return custumCell } //*其他indexPath.row对应的cell代码,用于展示餐厅名称、地址等* if indexPath.row == 10 { return getBusinessHoursTimeRangesForDaysOfWeekTableViewCellToBeUsedForDetailViewFromListView(amountOfTimeRanges: selectedVenueDetailViewInfo.hours.numberOfOpenHoursTimeRangesAsStringTypeOfTableViewCellToUse, indexPathFromScrollableCitiesRestaurantDetailsViewController: indexPath) } //以下代码用于保证TableView正常显示,实际不会展示 let cell = scrollableCitiesRestaurantDetailsTableView.dequeueReusableCell(withIdentifier: "DetailsTitleTableViewCell", for: indexPath) as! DetailsTitleTableViewCell cell.restaurantNameLabel.text = String(indexPath.row) return cell } } //*一些扩展*
GetSelectedRestaurantOpenHoursTableViewCellToBeUsed-ExtensionOfScrollableCitiesRestaurantDetailsViewController.swift
import UIKit import Foundation extension ScrollableCitiesRestaurantDetailsViewController { func getBusinessHoursTimeRangesForDaysOfWeekTableViewCellToBeUsedForDetailViewFromListView(amountOfTimeRanges: String, indexPathFromScrollableCitiesRestaurantDetailsViewController: IndexPath) -> UITableViewCell { switch amountOfTimeRanges { case "OneTimeRange": let detailsHoursContentsCustomCell = scrollableCitiesRestaurantDetailsTableView.dequeueReusableCell(withIdentifier: "DetailsHoursContentsForAllDaysWithOneOpenCloseTimeRangePairTableViewCell", for: indexPathFromScrollableCitiesRestaurantDetailsViewController) as! DetailsHoursContentsForAllDaysWithOneOpenCloseTimeRangePairTableViewCell detailsHoursContentsCustomCell.sundayHoursOpenWithoutDayLabel.text = selectedVenueDetailViewInfo.hours.sundayOpenHoursWithoutDay detailsHoursContentsCustomCell.mondayHoursOpenWithoutDayLabel.text = selectedVenueDetailViewInfo.hours.mondayOpenHoursWithoutDay detailsHoursContentsCustomCell.tuesdayHoursOpenWithoutDayLabel.text = selectedVenueDetailViewInfo.hours.tuesdayOpenHoursWithoutDay detailsHoursContentsCustomCell.wednesdayHoursOpenWithoutDayLabel.text = selectedVenueDetailViewInfo.hours.wednesdayOpenHoursWithoutDay detailsHoursContentsCustomCell.thursdayHoursOpenWithoutDayLabel.text = selectedVenueDetailViewInfo.hours.thursdayOpenHoursWithoutDay detailsHoursContentsCustomCell.fridayHoursOpenWithoutDayLabel.text = selectedVenueDetailViewInfo.hours.fridayOpenHoursWithoutDay detailsHoursContentsCustomCell.saturdayHoursOpenWithoutDayLabel.text = selectedVenueDetailViewInfo.hours.saturdayOpenHoursWithoutDay return detailsHoursContentsCustomCell case "TwoTimeRanges": let detailsHoursContentsCustomCell = scrollableCitiesRestaurantDetailsTableView.dequeueReusableCell(withIdentifier: "DetailsHoursContentsForAtLeastOneDayWithTwoOpenCloseTimeRangePairsTableViewCell", for: indexPathFromScrollableCitiesRestaurantDetailsViewController) as! DetailsHoursContentsForAtLeastOneDayWithTwoOpenCloseTimeRangePairsTableViewCell detailsHoursContentsCustomCell.sundayHoursOpenWithoutDayLabel.text = selectedVenueDetailViewInfo.hours.sundayOpenHoursWithoutDay detailsHoursContentsCustomCell.mondayHoursOpenWithoutDayLabel.text = selectedVenueDetailViewInfo.hours.mondayOpenHoursWithoutDay detailsHoursContentsCustomCell.tuesdayHoursOpenWithoutDayLabel.text = selectedVenueDetailViewInfo.hours.tuesdayOpenHoursWithoutDay detailsHoursContentsCustomCell.wednesdayHoursOpenWithoutDayLabel.text = selectedVenueDetailViewInfo.hours.wednesdayOpenHoursWithoutDay detailsHoursContentsCustomCell.thursdayHoursOpenWithoutDayLabel.text = selectedVenueDetailViewInfo.hours.thursdayOpenHoursWithoutDay detailsHoursContentsCustomCell.fridayHoursOpenWithoutDayLabel.text = selectedVenueDetailViewInfo.hours.fridayOpenHoursWithoutDay detailsHoursContentsCustomCell.saturdayHoursOpenWithoutDayLabel.text = selectedVenueDetailViewInfo.hours.saturdayOpenHoursWithoutDay return detailsHoursContentsCustomCell default: let detailsHoursContentsCustomCell = scrollableCitiesRestaurantDetailsTableView.dequeueReusableCell(withIdentifier: "DetailsHoursContentsForAllDaysWithOneOpenCloseTimeRangePairTableViewCell", for: indexPathFromScrollableCitiesRestaurantDetailsViewController) as! DetailsHoursContentsForAllDaysWithOneOpenCloseTimeRangePairTableViewCell detailsHoursContentsCustomCell.sundayHoursOpenWithoutDayLabel.text = selectedVenueDetailViewInfo.hours.sundayOpenHoursWithoutDay detailsHoursContentsCustomCell.mondayHoursOpenWithoutDayLabel.text = selectedVenueDetailViewInfo.hours.mondayOpenHoursWithoutDay detailsHoursContentsCustomCell.tuesdayHoursOpenWithoutDayLabel.text = selectedVenueDetailViewInfo.hours.tuesdayOpenHoursWithoutDay detailsHoursContentsCustomCell.wednesdayHoursOpenWithoutDayLabel.text = selectedVenueDetailViewInfo.hours.wednesdayOpenHoursWithoutDay detailsHoursContentsCustomCell.thursdayHoursOpenWithoutDayLabel.text = selectedVenueDetailViewInfo.hours.thursdayOpenHoursWithoutDay detailsHoursContentsCustomCell.fridayHoursOpenWithoutDayLabel.text = selectedVenueDetailViewInfo.hours.fridayOpenHoursWithoutDay detailsHoursContentsCustomCell.saturdayHoursOpenWithoutDayLabel.text = selectedVenueDetailViewInfo.hours.saturdayOpenHoursWithoutDay return detailsHoursContentsCustomCell } } }
DetailsHoursContentsForAllDaysWithOneOpenCloseTimeRangePairTableViewCell.swift
import UIKit class DetailsHoursContentsForAllDaysWithOneOpenCloseTimeRangePairTableViewCell: UITableViewCell { static let identifier = "DetailsHoursContentsForAllDaysWithOneOpenCloseTimeRangePairTableViewCell" static func nib() -> UINib { return UINib(nibName: "DetailsHoursContentsForAllDaysWithOneOpenCloseTimeRangePairTableViewCell", bundle: nil) } //IBOutlets @IBOutlet var sundayHoursOpenWithoutDayLabel: UILabel! @IBOutlet var mondayHoursOpenWithoutDayLabel: UILabel! @IBOutlet var tuesdayHoursOpenWithoutDayLabel: UILabel! @IBOutlet var wednesdayHoursOpenWithoutDayLabel: UILabel! @IBOutlet var thursdayHoursOpenWithoutDayLabel: UILabel! @IBOutlet var fridayHoursOpenWithoutDayLabel: UILabel! @IBOutlet var saturdayHoursOpenWithoutDayLabel: UILabel! var selectedVenueDetailViewInfo: SelectedRestaurantDetailViewInfo! override func awakeFromNib() { super.awakeFromNib() // 初始化代码 } override func setSelected(_ selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) // 配置选中状态的视图 } }
可能的解决方向
检查TableView的行高设置
- 确保开启自动行高,让TableView根据cell内容计算高度:
scrollableCitiesRestaurantDetailsTableView.rowHeight = UITableView.automaticDimension scrollableCitiesRestaurantDetailsTableView.estimatedRowHeight = 200 // 设置接近cell实际高度的估计值 - 若手动设置行高,确认高度值足够容纳cell所有内容。
- 确保开启自动行高,让TableView根据cell内容计算高度:
检查cell的约束布局
- 打开cell的.xib文件,确保所有Label的约束完整:周日Label顶部与cell顶部对齐,周六Label底部与cell底部对齐,各Label间添加垂直间距约束,保证AutoLayout能正确计算cell高度。
- 检查Xcode的Issue navigator,确认无约束冲突。
验证数据赋值是否正确
- 在设置Label文本的位置添加打印语句,确认周一至周六的时间数据不为空:
print("周一营业时间:\(selectedVenueDetailViewInfo.hours.mondayOpenHoursWithoutDay ?? "空")") - 若数据为空,排查API数据解析逻辑是否存在问题。
- 在设置Label文本的位置添加打印语句,确认周一至周六的时间数据不为空:
确认cell的注册逻辑
- 检查
viewDidLoad中是否正确注册了所有自定义cell的nib文件:scrollableCitiesRestaurantDetailsTableView.register(DetailsHoursContentsForAllDaysWithOneOpenCloseTimeRangePairTableViewCell.nib(), forCellReuseIdentifier: DetailsHoursContentsForAllDaysWithOneOpenCloseTimeRangePairTableViewCell.identifier) scrollableCitiesRestaurantDetailsTableView.register(DetailsHoursContentsForAtLeastOneDayWithTwoOpenCloseTimeRangePairsTableViewCell.nib(), forCellReuseIdentifier: DetailsHoursContentsForAtLeastOneDayWithTwoOpenCloseTimeRangePairsTableViewCell.identifier)
- 检查
内容的提问来源于stack exchange,提问作者cg1000
相关产品推荐
相关产品推荐

