0
我有一個UITableViewCell的子類,它有override func layoutSubviews()
爲每個單元調用兩次。這是在單元格內創建多個元素的副本。Inside Subclassed UITableViewCell Override Func LayoutSubviews被稱爲雙重
UITableView返回正確的單元格數並顯示正確的單元格數,但佈局函數將少數屬性重置爲零。因此不正確地渲染大量數據。
的TableView內的UIViewController:
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)
}
同意。當視圖改變其狀態或界限時,存在'layoutSubviews'來更新子視圖的位置。你應該期望這種方法可以多次調用。它的性能也很重要,因爲緩慢的'layoutSubviews'會阻止主線程並阻止應用程序重繪,所以你應該儘量避免在這裏重複不必要的工作。 – Jonah