单元格未在表格视图中正确显示
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固定到superviewb.设置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
输出
【讨论】:
以上是关于单元格未在表格视图中正确显示的主要内容,如果未能解决你的问题,请参考以下文章