You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

        // 配置选中状态的视图
    }
    
}

可能的解决方向

  1. 检查TableView的行高设置

    • 确保开启自动行高,让TableView根据cell内容计算高度:
      scrollableCitiesRestaurantDetailsTableView.rowHeight = UITableView.automaticDimension
      scrollableCitiesRestaurantDetailsTableView.estimatedRowHeight = 200 // 设置接近cell实际高度的估计值
      
    • 若手动设置行高,确认高度值足够容纳cell所有内容。
  2. 检查cell的约束布局

    • 打开cell的.xib文件,确保所有Label的约束完整:周日Label顶部与cell顶部对齐,周六Label底部与cell底部对齐,各Label间添加垂直间距约束,保证AutoLayout能正确计算cell高度。
    • 检查Xcode的Issue navigator,确认无约束冲突。
  3. 验证数据赋值是否正确

    • 在设置Label文本的位置添加打印语句,确认周一至周六的时间数据不为空:
      print("周一营业时间:\(selectedVenueDetailViewInfo.hours.mondayOpenHoursWithoutDay ?? "空")")
      
    • 若数据为空,排查API数据解析逻辑是否存在问题。
  4. 确认cell的注册逻辑

    • 检查viewDidLoad中是否正确注册了所有自定义cell的nib文件:
      scrollableCitiesRestaurantDetailsTableView.register(DetailsHoursContentsForAllDaysWithOneOpenCloseTimeRangePairTableViewCell.nib(), forCellReuseIdentifier: DetailsHoursContentsForAllDaysWithOneOpenCloseTimeRangePairTableViewCell.identifier)
      scrollableCitiesRestaurantDetailsTableView.register(DetailsHoursContentsForAtLeastOneDayWithTwoOpenCloseTimeRangePairsTableViewCell.nib(), forCellReuseIdentifier: DetailsHoursContentsForAtLeastOneDayWithTwoOpenCloseTimeRangePairsTableViewCell.identifier)
      

内容的提问来源于stack exchange,提问作者cg1000

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 10:42:00