2015-12-17 29 views
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) 

} 

回答

1

你應該「不會出現在layoutSubviews反正這樣做。相反,將配置移動到單獨的方法,並使表視圖數據源在取出單元后調用該配置方法。

+0

同意。當視圖改變其狀態或界限時,存在'layoutSubviews'來更新子視圖的位置。你應該期望這種方法可以多次調用。它的性能也很重要,因爲緩慢的'layoutSubviews'會阻止主線程並阻止應用程序重繪,所以你應該儘量避免在這裏重複不必要的工作。 – Jonah

相關問題