我有一個游戲,我想在 tableview 中顯示歷史記錄。游戲可以精確地與 4 名玩家一起玩。贏家/輸家的結果可能在 2w/2l、3w/1l 或 1w/3l 之間變化。
因此,我創建了一個自定義單元格作為 XIB,我在堆疊視圖中放置了 3 個標簽(每個標簽用于贏家和輸家,所以總共有 6 個標簽),默認情況下我總是隱藏 2 個。然后,當我有多個贏家/輸家時,我將取消隱藏它們并設定名稱。
但不知何故,我的代碼做了一些我不明白的事情。我試圖除錯我的代碼,但如果它運行緩慢似乎沒問題。我不明白。
我的Players結構只是我的 Realm 物件的一小部分。整個allPlayers陣列也只是虛擬資料,通常我從領域獲取它。
struct Players {
let round: Int
let name: String
let winner: Bool
let loser: Bool
}
所以我的ViewController標準設定如下:
class ViewController: UIViewController {
@IBOutlet weak var tableView: UITableView!
let allPlayers: [Players] = [Players(round: 1, name: "Mike", winner: false, loser: true), // Round 1 2:2
Players(round: 1, name: "Peter", winner: false, loser: true),
Players(round: 1, name: "Tim", winner: true, loser: false),
Players(round: 1, name: "Levi", winner: true, loser: false),
Players(round: 2, name: "Mike", winner: false, loser: true), // Round 2 1:3
Players(round: 2, name: "Peter", winner: false, loser: true),
Players(round: 2, name: "Tim", winner: false, loser: true),
Players(round: 2, name: "Levi", winner: true, loser: false),
Players(round: 3, name: "Mike", winner: true, loser: false), // Round 3 3:1
Players(round: 3, name: "Peter", winner: true, loser: false),
Players(round: 3, name: "Tim", winner: true, loser: false),
Players(round: 3, name: "Levi", winner: false, loser: true),
Players(round: 4, name: "Mike", winner: false, loser: true), // Round 4 2:2
Players(round: 4, name: "Peter", winner: false, loser: true),
Players(round: 4, name: "Tim", winner: true, loser: false),
Players(round: 4, name: "Levi", winner: true, loser: false),
Players(round: 5, name: "Mike", winner: false, loser: true), // Round 5 1:3
Players(round: 5, name: "Peter", winner: false, loser: true),
Players(round: 5, name: "Tim", winner: false, loser: true),
Players(round: 5, name: "Levi", winner: true, loser: false),
Players(round: 6, name: "Mike", winner: true, loser: false), // Round 6 3:1
Players(round: 6, name: "Peter", winner: true, loser: false),
Players(round: 6, name: "Tim", winner: true, loser: false),
Players(round: 6, name: "Levi", winner: false, loser: true),
Players(round: 7, name: "Mike", winner: true, loser: false), // Round 7 3:1
Players(round: 7, name: "Peter", winner: true, loser: false),
Players(round: 7, name: "Tim", winner: true, loser: false),
Players(round: 7, name: "Levi", winner: false, loser: true),
Players(round: 8, name: "Mike", winner: false, loser: true), // Round 8 1:3
Players(round: 8, name: "Peter", winner: false, loser: true),
Players(round: 8, name: "Tim", winner: false, loser: true),
Players(round: 8, name: "Levi", winner: true, loser: false),
Players(round: 9, name: "Mike", winner: false, loser: true), // Round 9 1:3
Players(round: 9, name: "Peter", winner: false, loser: true),
Players(round: 9, name: "Tim", winner: false, loser: true),
Players(round: 9, name: "Levi", winner: true, loser: false),
Players(round: 10, name: "Mike", winner: false, loser: true), // Round 10 2:2
Players(round: 10, name: "Peter", winner: false, loser: true),
Players(round: 10, name: "Tim", winner: true, loser: false),
Players(round: 10, name: "Levi", winner: true, loser: false),
Players(round: 11, name: "Mike", winner: false, loser: true), // Round 11 2:2
Players(round: 11, name: "Peter", winner: false, loser: true),
Players(round: 11, name: "Tim", winner: true, loser: false),
Players(round: 11, name: "Levi", winner: true, loser: false),
Players(round: 12, name: "Mike", winner: true, loser: false), // Round 12 3:1
Players(round: 12, name: "Peter", winner: true, loser: false),
Players(round: 12, name: "Tim", winner: true, loser: false),
Players(round: 12, name: "Levi", winner: false, loser: true)]
override func viewDidLoad() {
super.viewDidLoad()
tableView.dataSource = self
let nib = UINib.init(nibName: "TableViewCell", bundle: nil)
self.tableView.register(nib, forCellReuseIdentifier: "winLooseCell")
}
}
Because I fetch the data from Realm I made a separate class handler to manage the results and so I only get back arrays of names of the winners/losers.
class Handler {
var winners: [String] = []
var losers: [String] = []
func getWinners(round: Int,dataBase: [Players]) -> [String] {
// Filtercode is just boilerplate, is dunno by realm
let filtered = dataBase.filter{ dataBase in
return dataBase.round == round
}
for i in 0...filtered.count - 1 {
if filtered[i].winner {
winners.append(filtered[i].name)
}
}
return winners
}
func getLosers(round: Int,dataBase: [Players]) -> [String] {
// Filtercode is just boilerplate, is dunno by realm
let filtered = dataBase.filter{ dataBase in
return dataBase.round == round
}
for i in 0...filtered.count - 1{
if filtered[i].loser {
losers.append(filtered[i].name)
}
}
return losers
}
}
And of course my tableView extension to create the whole thing
// MARK: Extension
extension ViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return (allPlayers.count / 4)
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let handler = Handler()
if indexPath.row == 10 {
// do nothing - just for a debugging breakpoint
}
let cell = tableView.dequeueReusableCell(withIdentifier: "winLooseCell") as! TableViewCell
let winner = handler.getWinners(round: indexPath.row 1, dataBase: allPlayers)
for i in 0...winner.count - 1 {
cell.winnerNameLabels[i].isHidden = false
cell.winnerNameLabels[i].text = winner[i]
}
let loser = handler.getLosers(round: indexPath.row 1, dataBase: allPlayers)
for i in 0...loser.count - 1 {
cell.loserNameLabels[i].isHidden = false
cell.loserNameLabels[i].text = loser[i]
}
cell.roundLabel.text = "\(indexPath.row 1)"
return cell
}
}
The class for the tableViewCell
class TableViewCell: UITableViewCell {
@IBOutlet var winnerNameLabels: [UILabel]!
@IBOutlet var loserNameLabels: [UILabel]!
@IBOutlet weak var roundLabel: UILabel!
}
and the Xib File

and for some reason after I load the simulator I get in round 11 this weird behavior

Anyone got an idea why and how I can solve this issue?
uj5u.com熱心網友回復:
你忘記了細胞被重用。出現在某一行中的單元格稍后可能會重新出現在另一行中 - 例如,當您滾動時。因此,您必須在配置單元格的邏輯中完全考慮這是哪一行。
因此,在 中cellForRowAt,我們看到您的代碼可能會說
cell.winnerNameLabels[i].isHidden = false
但在沒有時間,你曾經說
cell.winnerNameLabels[i].isHidden = true
因此,一旦您取消隱藏此單元格的標簽,在應用程式的剩余生命周期中,無論此單元格在哪一行重復使用,它都會保持未隱藏狀態。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/326565.html
