单元格未在表格视图中正确显示

Posted

技术标签:

【中文标题】单元格未在表格视图中正确显示【英文标题】:Cell doesn't show up properly in table view 【发布时间】:2017-07-18 06:35:36 【问题描述】:

我正在使用 TableView 在 ViewController 上实现它。我面临的问题是细胞数量。目前单元格应该返回 2 行,但它只显示一行。

我想要达到的目标

故事板 - 你可以忽略除 tableview 之外的其余组件

import UIKit


class ViewController: UIViewController 

    @IBOutlet var locationTableView: UITableView!

    let locationArray = ["Current Location", "Where to"]
    let picArray = ["currentPic.png", "whereTo.png"]

    override func viewDidLoad() 
        super.viewDidLoad()


        locationTableView.delegate = self
      


extension ViewController: UITableViewDelegate, UITableViewDataSource 


    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        // #warning Incomplete implementation, return the number of rows
        return locationArray.count
    


     func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
     let cell = tableView.dequeueReusableCell(withIdentifier: "GetLocation", for: indexPath)

     let location = locationArray[indexPath.row]
     let pic = picArray[indexPath.row]
        print(location)
        if let locationCell = cell as? GetLocationTableViewCell 
            locationCell.locationTitle.text = location
            locationCell.iconImage.image = pic
        

     return cell

     

GetLocationTableViewCell.swift

    import UIKit

    class GetLocationTableViewCell: UITableViewCell 


        @IBOutlet var iconImage: UIImageView!

        @IBOutlet var locationTitle: UILabel!

        override func setSelected(_ selected: Bool, animated: Bool) 
            super.setSelected(selected, animated: animated)

            // Configure the view for the selected state
        

    

结果真的很奇怪

在模拟器上

在我的 iPhone 上

两个平台上的行数不同。我做错什么了?是因为约束吗?

【问题讨论】:

表格视图单元格中有表格视图吗?为什么? 显然这似乎是与约束相关的问题,你的约束是如何通过的! 【参考方案1】:

这里是问题locationArray[indexPath.section] , picArray[indexPath.section] 你的部分是返回 0 所以你得到两次显示“当前位置”你需要使用indexPath.row

试试这个

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
     let cell = tableView.dequeueReusableCell(withIdentifier: "GetLocation", for: indexPath)

     let location = locationArray[indexPath.row]
     let pic = picArray[indexPath.row]
        print(location)
        if let locationCell = cell as? GetLocationTableViewCell 
            locationCell.locationTitle.text = location
            locationCell.iconImage.image = pic
        

     return cell

     

【讨论】:

我已经更新了问题,我使用了你的方法将部分更改为行,它可以工作,但是在两个平台上行数仍然无法预测,是不是因为限制? 是的,你需要给你的视图适当的高度限制 使用自动布局 你说的是单元格约束吗? 还是需要固定tableview本身的高度?【参考方案2】:

像这样改变你的表委托方法:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
     let cell = tableView.dequeueReusableCell(withIdentifier: "GetLocation", for: indexPath)

     let location = locationArray[indexPath.section]
     let pic = picArray[indexPath.row]//replace this line
        print(location)
        if let locationCell = cell as? GetLocationTableViewCell 
            locationCell.locationTitle.text = location
            locationCell.iconImage.image = pic
        

     return cell

     

【讨论】:

【参考方案3】:

你可以像贝娄一样尝试。你可以写数组像

 let locationArray = [
    ["textName":"Current Location", "imageName":"currentPic"],
    ["textName":"Where to", "imageName":"whereTo"]
]

表格视图协议方法的样子

     override func numberOfSections(in tableView: UITableView) -> Int 
        // #warning Incomplete implementation, return the number of sections
       return 1
  

     override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 

      return locationArray.count
   


  override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
     let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath) CustomCell

    cell.textLabel?.text = locationArray[indexPath.row]["textName"]
    cell.imageView?.image = UIImage(named: locationArray[indexPath.row]["imageName"]!)

      return cell
     

【讨论】:

如果你想添加部分,只需写 indexPath.section。不需要维护两个数组。【参考方案4】:

替换方法cellRowAtPath中的以下内容

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
     let cell = tableView.dequeueReusableCell(withIdentifier: "GetLocation", for: indexPath)

     let location = locationArray[indexPath.row]
     let pic = picArray[indexPath.row]
        print(location)
        if let locationCell = cell as? GetLocationTableViewCell 
            locationCell.locationTitle.text = location
            locationCell.iconImage.image = pic
        

     return cell




func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 
        return 102 //Give cell height

【讨论】:

我已经用过这个方法了,但是无法预料。你可以看看更新的问题 确保你给 locationTableView.dataSource = self【参考方案5】:

根据您的问题,我建议您管理应用于 tableview 和 Cell 的约束。在这里,我提供了获取解决方案的说明。请设法在您的项目中遵循相同的说明希望这能解决您的问题。

1.管理 tableview 约束

一个。从上、左、右

将您的tableview固定到superview

b.设置tableview的height约束。

c。为 tableview 制作高度约束的出口,以便我们可以在运行时更改值。

2。管理单元约束

一个。从上、左、右、下将您的单元格内容固定到超级视图 3。在运行时管理 tableview 约束

一个。将表格视图的高度约束设置为表格视图的内容大小,从单元格开始拖到索引路径。

self.tableHeight.constant = self.locationTableView.contentSize.height

完整的控制器代码。

//  Controller.swift
//  Copyright © 2017 dip. All rights reserved.
//

import UIKit


class ViewController1: UIViewController 

    //1:
    //Outlet of tableview Height constraints
    @IBOutlet weak var tableHeight: NSLayoutConstraint!

    @IBOutlet var locationTableView: UITableView!

    let locationArray = ["Current Location", "Where to"]
    let picArray = ["currentPic.png", "whereTo.png"]

    override func viewDidLoad() 
        super.viewDidLoad()

        locationTableView.delegate = self
    


extension ViewController1: UITableViewDelegate, UITableViewDataSource 


    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        // #warning Incomplete implementation, return the number of rows
        return locationArray.count
    


    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "GetLocation", for: indexPath)

        let location = locationArray[indexPath.row]
        let pic = picArray[indexPath.row]
        print(location)
        if let locationCell = cell as? GetLocationTableViewCell 
            locationCell.locationTitle.text = location
            locationCell.iconImage.image = pic
        

        //2. set tableivew view height to content Height
        self.tableHeight.constant = self.locationTableView.contentSize.height


        return cell

    

输出

【讨论】:

以上是关于单元格未在表格视图中正确显示的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 表格视图单元格未正确呈现

iOS - 带有 UITextView 的表格视图单元格未正确调整大小

UITableView 单元格未正确显示

表格视图中的自定义单元格未显示?

表格视图单元格未显示在情节提要中

我的自定义单元格未显示在我的表格视图中