无法通过 heightForRowAt 获取表视图中的单元格
Cannot get cell in tableview by heightForRowAt
我尝试为动态内容设置单元格高度。在单元格中,我使用了两个 UILabel,但我无法从 tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath)
访问单元格。正如 tableview 显示的那样,有来自 img 的单元格,但是当我 运行 模拟器中的应用程序时, print("Cell geted")
什么也不输出。 我只是 IOS 开发的初学者,所以我的应用程序中可能存在一些错误的配置。我想知道是什么原因导致的
override func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
return 100
}
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
let cell = self.tableView.cellForRow(at: indexPath) as? ArticleTableViewCell
if(cell != nil) {
print("Cell geted")
}
return 120
}
我使用xib文件来定义cell
Comtum 电池 class 如下
import UIKit
class ArticleTableViewCell: UITableViewCell {
@IBOutlet weak var time: UILabel!
@IBOutlet weak var digest: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
time.layer.borderWidth = 1
//time.layer.masksToBounds = true
time.layer.cornerRadius = 10
time.backgroundColor = UIColor.cyan
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
故事板 xib 文件如下
您必须提供数据的高度(通过计算数据的任何度量),您无法访问该委托方法中的单元格。
在 heightForRow
你应该 return UITableViewAutomaticDimension
。如果这样做,那么 tableView
在从 cellForRowAt
.
获取单元格时会自动使用自动布局
简而言之:
在 viewDidLoad
设置中:
tableView.estimatedRowHeight = 100
tableView.rowHeight = UITableViewAutomaticDimension
在单元格中设置自动布局,以便单元格可以根据其内容确定自己的大小。
要使用自动布局在 xib 单元中设置单元设计,请阅读 this article。在您的情况下,您可以执行以下操作:
首先,点击标签select。然后点击右下角的"Add New Constraints"图标,见下图:
一个小弹出窗口显示,其中设置了一些常量,这些常量定义了标签应该被约束到单元格的上、左、下和右角的距离。确保指示正在激活的约束的红线是实线(一旦您填写常量,它们应该从虚线变为实线)。先试试每个方向都设置8,以后可以玩玩
However, make sure that you read [this article][1] and also [this article on autolayout][4].
- 只是 return
cellForRowAt
中的一个单元格。 TableView 将使用单元格的自动布局来确定其高度。
参见 this answer for details, or my 。
编辑
要使单元格根据行数展开,在didSelect
中将标签的行数设置为0,并使用以下方法告诉tableView
重绘自己:
func refreshTableAfterCellExpansion() {
self.tableView.beginUpdates()
self.tableView.setNeedsDisplay()
self.tableView.endUpdates()
}
在didDeselect
.
中做同样的事情,只是相反
要为行高和估计行高设置自动尺寸,请确保按照以下步骤制作,自动尺寸对 cell/row 高度布局有效。我刚刚测试了以下步骤和代码并且工作正常。
- 分配并实现表视图数据源和委托
- 将
UITableViewAutomaticDimension
分配给 rowHeight & estimatedRowHeight
- 实施delegate/dataSource方法(即
heightForRowAt
和return一个值UITableViewAutomaticDimension
)
-
@IBOutlet weak var table: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
// Don't forget to set dataSource and delegate for table
table.dataSource = self
table.delegate = self
// Set automatic dimensions for row height
table.rowHeight = UITableViewAutomaticDimension
table.estimatedRowHeight = UITableViewAutomaticDimension
}
// UITableViewAutomaticDimension calculates height of label contents/text
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableViewAutomaticDimension
}
对于 UITableviewCell 中的标签实例
- 设置行数=0(&换行模式=截尾)
- 设置关于其父视图/单元格容器的所有约束(顶部、底部、左右)。
- 可选:设置标签的最小高度,如果你想要标签覆盖的最小垂直区域,即使没有数据。
注意:如果你有多个具有动态长度的标签(UIElements),应根据其内容大小进行调整:调整'Content Hugging and Compression Resistance Priority ` 对于您想要 expand/compress 具有更高优先级的标签。
在此示例中,我设置了低拥抱和高压缩阻力优先级,这导致为第二个(黄色)标签的内容设置更多 priority/importance。
我尝试为动态内容设置单元格高度。在单元格中,我使用了两个 UILabel,但我无法从 tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath)
访问单元格。正如 tableview 显示的那样,有来自 img 的单元格,但是当我 运行 模拟器中的应用程序时, print("Cell geted")
什么也不输出。 我只是 IOS 开发的初学者,所以我的应用程序中可能存在一些错误的配置。我想知道是什么原因导致的
override func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
return 100
}
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
let cell = self.tableView.cellForRow(at: indexPath) as? ArticleTableViewCell
if(cell != nil) {
print("Cell geted")
}
return 120
}
我使用xib文件来定义cell
Comtum 电池 class 如下
import UIKit
class ArticleTableViewCell: UITableViewCell {
@IBOutlet weak var time: UILabel!
@IBOutlet weak var digest: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
time.layer.borderWidth = 1
//time.layer.masksToBounds = true
time.layer.cornerRadius = 10
time.backgroundColor = UIColor.cyan
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
故事板 xib 文件如下
您必须提供数据的高度(通过计算数据的任何度量),您无法访问该委托方法中的单元格。
在 heightForRow
你应该 return UITableViewAutomaticDimension
。如果这样做,那么 tableView
在从 cellForRowAt
.
简而言之:
在
viewDidLoad
设置中:tableView.estimatedRowHeight = 100 tableView.rowHeight = UITableViewAutomaticDimension
在单元格中设置自动布局,以便单元格可以根据其内容确定自己的大小。
要使用自动布局在 xib 单元中设置单元设计,请阅读 this article。在您的情况下,您可以执行以下操作:
首先,点击标签select。然后点击右下角的"Add New Constraints"图标,见下图:
一个小弹出窗口显示,其中设置了一些常量,这些常量定义了标签应该被约束到单元格的上、左、下和右角的距离。确保指示正在激活的约束的红线是实线(一旦您填写常量,它们应该从虚线变为实线)。先试试每个方向都设置8,以后可以玩玩
However, make sure that you read [this article][1] and also [this article on autolayout][4].
- 只是 return
cellForRowAt
中的一个单元格。 TableView 将使用单元格的自动布局来确定其高度。
参见 this answer for details, or my
编辑
要使单元格根据行数展开,在didSelect
中将标签的行数设置为0,并使用以下方法告诉tableView
重绘自己:
func refreshTableAfterCellExpansion() {
self.tableView.beginUpdates()
self.tableView.setNeedsDisplay()
self.tableView.endUpdates()
}
在didDeselect
.
要为行高和估计行高设置自动尺寸,请确保按照以下步骤制作,自动尺寸对 cell/row 高度布局有效。我刚刚测试了以下步骤和代码并且工作正常。
- 分配并实现表视图数据源和委托
- 将
UITableViewAutomaticDimension
分配给 rowHeight & estimatedRowHeight - 实施delegate/dataSource方法(即
heightForRowAt
和return一个值UITableViewAutomaticDimension
)
-
@IBOutlet weak var table: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
// Don't forget to set dataSource and delegate for table
table.dataSource = self
table.delegate = self
// Set automatic dimensions for row height
table.rowHeight = UITableViewAutomaticDimension
table.estimatedRowHeight = UITableViewAutomaticDimension
}
// UITableViewAutomaticDimension calculates height of label contents/text
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableViewAutomaticDimension
}
对于 UITableviewCell 中的标签实例
- 设置行数=0(&换行模式=截尾)
- 设置关于其父视图/单元格容器的所有约束(顶部、底部、左右)。
- 可选:设置标签的最小高度,如果你想要标签覆盖的最小垂直区域,即使没有数据。
注意:如果你有多个具有动态长度的标签(UIElements),应根据其内容大小进行调整:调整'Content Hugging and Compression Resistance Priority ` 对于您想要 expand/compress 具有更高优先级的标签。
在此示例中,我设置了低拥抱和高压缩阻力优先级,这导致为第二个(黄色)标签的内容设置更多 priority/importance。