在子类化 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 进行子类化?