【发布时间】:2015-06-23 06:31:51
【问题描述】:
我有一些自定义 UITableViewCell,当我滚动时,自定义标签和图像视图变得非常复杂。像这样:
当我阅读 prepareForReuse 的文档时,不清楚该方法应该做什么。它说:
出于性能原因,您应该只重置单元格的属性 与内容无关的内容,例如 alpha、编辑和 选择状态。表视图的委托 tableView:cellForRowAtIndexPath: 应该总是重置所有内容 重复使用一个单元格。
但是,在我的自定义单元格中,我必须删除所有标签和图像视图。我目前在我的自定义表格单元格中的 prepareForReuse 中有这个。
我有三个问题: 1.内容翻倍是可以预期的吗?还是我做错了什么? 2.如果正常,是否只有通过删除FromSuperview元素来处理这个问题?我尝试将它们设置为 nil ,但这并不完全有效。 3. prepareForReuse 是否是删除FromSuperview 的合适位置?如:
import UIKit
class EKMenuItemCell: UITableViewCell {
var screenWidth:CGFloat = 0
var screenHeight:CGFloat = 0
let leftMIPadding:CGFloat = 40.0
let rightMIPadding:CGFloat = 90.0
let rightPricePadding:CGFloat = 60.0
var mainItemWidth:CGFloat = 0
var miHeaderLabel = UILabel()
var miDetailLabel = UILabel()
var miPriceLabel = UILabel()
func updateCell(menuItem: EKMenuItem){
var bounds = UIScreen.mainScreen().bounds
self.screenWidth = bounds.size.width
self.screenHeight = bounds.size.height
self.mainItemWidth = self.screenWidth - (self.leftMIPadding + self.rightMIPadding)
self.renderMenuItemHeader(menuItem)
self.renderMenuItemDetail(menuItem)
//self.renderMenuItemPrice(menuItem)
}
func renderMenuItemHeader(menuItem: EKMenuItem){
miHeaderLabel=UILabel(frame: CGRectMake(leftMIPadding,0, self.mainItemWidth, CGFloat.max))
miHeaderLabel.text=menuItem.header
miHeaderLabel.numberOfLines=0
miHeaderLabel.lineBreakMode = NSLineBreakMode.ByWordWrapping
miHeaderLabel.sizeToFit()
miHeaderLabel.frame = CGRectMake(leftMIPadding, 10, self.mainItemWidth, miHeaderLabel.frame.size.height)
miHeaderLabel.layer.borderWidth = 2.0
miHeaderLabel.layer.borderColor = UIColor.greenColor().CGColor
menuItem.cellHeight = miHeaderLabel.frame.size.height + 10
self.contentView.addSubview(miHeaderLabel)
}
func renderMenuItemDetail(menuItem: EKMenuItem){
//println("here is my menuItem.detail")
miDetailLabel=UILabel(frame: CGRectMake(leftMIPadding, 0, self.mainItemWidth, CGFloat.max))
miDetailLabel.text=menuItem.detail
miDetailLabel.numberOfLines=0
miDetailLabel.lineBreakMode = NSLineBreakMode.ByWordWrapping
miDetailLabel.sizeToFit()
miDetailLabel.frame = CGRectMake(leftMIPadding, (miHeaderLabel.frame.size.height + 20), self.mainItemWidth, miDetailLabel.frame.size.height)
miDetailLabel.layer.borderWidth = 2.0
miDetailLabel.layer.borderColor = UIColor.greenColor().CGColor
menuItem.cellHeight += miDetailLabel.frame.size.height + 10.0
self.contentView.addSubview(miDetailLabel)
}
override func prepareForReuse() {
println("here i am in prepareForReuse")
miDetailLabel.removeFromSuperview()
miHeaderLabel.removeFromSuperview()
super.prepareForReuse()
}
编辑 1
这是控制器中的 cellForRowAtIndexPath:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let tmpTableItem = self.tableItems[indexPath.row]
if let menuHeader = tmpTableItem as? EKMenuHeader {
let tableViewCell = tableView.dequeueReusableCellWithIdentifier("MenuHeaderCell", forIndexPath: indexPath) as! EKMenuHeaderCell
tableViewCell.selectionStyle = UITableViewCellSelectionStyle.None
tableViewCell.updateCell(menuHeader)
return tableViewCell
} else if let menuItem = tmpTableItem as? EKMenuItem {
let tableViewCell = tableView.dequeueReusableCellWithIdentifier("MenuItemCell", forIndexPath: indexPath) as! EKMenuItemCell
tableViewCell.updateCell(menuItem)
return tableViewCell
}
let tableViewCell = tableView.dequeueReusableCellWithIdentifier("TableViewCell", forIndexPath: indexPath) as! UITableViewCell
return tableViewCell
}
编辑 2
根据 Wain 的评论,当将字符串设置为“”时,我应用的边框完全不正常。看起来这很笨拙,从现代 iPhone 的子视图中删除性能很好。
【问题讨论】:
-
你能粘贴你的 cellForRowAtIndexPath: 方法吗
-
@BabulPrabhakar 完成了
-
你能发布 cellForRowAtIndexPath: 方法吗?你在哪里添加标签?
-
您是否检查过 prepareForReuse 方法是否在 cellForRowAtIndexPath 之前被调用?
-
thx @ZeMoon ,是的
prepareForReuse肯定被调用了。
标签: ios swift uitableview