在子类化 UITableViewCell 中重写 Func LayoutSubviews 被称为 Double

Posted

技术标签:

【中文标题】在子类化 UITableViewCell 中重写 Func LayoutSubviews 被称为 Double【英文标题】:Inside Subclassed UITableViewCell Override Func LayoutSubviews Being Called Double 【发布时间】:2015-12-17 21:13:38 【问题描述】:

我有一个 UITableViewCell 的子类,它为每个单元格调用了两次 override func layoutSubviews()。这是在单元格中创建元素的多个副本。

UITableView 返回正确的单元格数并显示正确的单元格数,但布局函数将一些属性重置为零。因此会错误地渲染很多数据。

UIViewController里面的TableView:

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

    return userMatches.count    // return 2 correctly



func numberOfSectionsInTableView(tableView: UITableView) -> Int 

    return 1



func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat 


    return self.view.bounds.height * 0.20




func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 

    let cell: MatchTableViewCell = self.matchTableView.dequeueReusableCellWithIdentifier("matchCell", forIndexPath: indexPath) as! MatchTableViewCell

    cell.matchDetails = userMatches[indexPath.row]
    cell.userInteractionEnabled = true
    cell.selectionStyle = UITableViewCellSelectionStyle.None

    return cell // creates 2 correctly


UITableView 子类:

   override func layoutSubviews() 
    super.layoutSubviews()

// runs 4 times

    let userHelperIconArray = [userZoom, userTakeTwo, userStopper]
    let opponentHelperIconArray = [opponentZoom, opponentTakeTwo, opponentStopper]

    layoutHelperInventoryIcons(self, opponentHelperIconArray: opponentHelperIconArray, userHelperIconArray: userHelperIconArray, opponentNameLabel: opponentName)
    layoutMiniGameboard(self)

    self.layer.borderWidth = 1.0
    self.layer.borderColor = UIColor.blackColor().CGColor

    print("one")

    turnIdentifier(self, matchDetails: matchDetails, opponentNameLabel: opponentName)


【问题讨论】:

【参考方案1】:

无论如何,你不应该在layoutSubviews 中这样做。相反,将配置移至单独的方法,并让您的表视图数据源在对单元格出列后调用该配置方法。

【讨论】:

同意。 layoutSubviews 用于在视图更改其状态或边界时更新子视图的位置。你应该期望这个方法可以被多次调用。它的性能也很重要,因为缓慢的layoutSubviews 会阻塞主线程并阻止应用重绘,因此您应该尽量避免在这里重复不必要的工作。

以上是关于在子类化 UITableViewCell 中重写 Func LayoutSubviews 被称为 Double的主要内容,如果未能解决你的问题,请参考以下文章

子类化 UITableViewCell 并在 Storyboard 中使用它

想知道如何以编程方式在 swift 3.0 中对 UITableViewCell 进行子类化?

子类化 UITableViewCell 不适用于出队

iOS:使用 nib 子类化 UITableViewCell,进入 UIView(不是视图控制器)子类

java 实例化是调用了子类重写方法

子类实例化,父类构造器中被调用被子类重写的方法,会执行父类还是子类的呢?