首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >定制UITableViewCells与prepareForReuse和removeFromSuperview的正确使用

定制UITableViewCells与prepareForReuse和removeFromSuperview的正确使用
EN

Stack Overflow用户
提问于 2015-06-23 06:31:51
回答 1查看 4.6K关注 0票数 2

我有一些自定义的UITableViewCell,当我滚动时,定制标签和图像视图变得非常复杂。如下所示:

当我阅读prepareForReuse的文档时,不清楚这个方法应该做什么。上面写着:

出于性能原因,只应重置与内容无关的单元格属性,例如alpha、编辑和选择状态。表视图在tableView:cellForRowAtIndexPath:中的委托应始终在重用单元格时重置所有内容。

但是,在我的自定义单元格中,我必须删除所有标签和图像视图。我目前在我的自定义表格单元格中的prepareForReuse中有这一项。

我有三个问题: 1.内容翻倍是否值得期待?或者我做了什么严重的错误? 2.如果正常的话,removingFromSuperview元素是处理这个问题的唯一方法吗?我试过把他们设为零,但这并不完全奏效。3. prepareForReuse对removeFromSuperview来说是合适的地方吗?例如:

代码语言:javascript
复制
    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:

代码语言:javascript
复制
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的评论,当将字符串设置为"“时,我所应用的边框就完全不正常了。这看上去很简陋,性能很好,可以从现代iPhones的子视图中删除。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-23 06:42:46

您不应该删除视图,因为这样会导致重新创建视图的成本。相反,您应该将文本设置为零,但是即使这样,如果每个单元格都有文本,您也不需要这样做,因为在单元格可见之前,新文本将取代旧的文本。大多数用例不要求您使用prepareForReuse

复制表明,您一直在添加新视图,而不是更新变量,因此每次尝试删除它们时,都不会发生任何实际情况。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30995412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档