使 tableView 显示偶数和奇数个单元格标题 Swift

Make tableView display even and odd number of cell titles Swift

我是编程新手,Swift 是我学习的第一门编程语言,如果问题的答案太明显,我深表歉意。 我的应用程序需要添加玩家数量以及用户希望将玩家分成的球队数量。对于偶数,我的 tableView 工作正常,如果用户插入 6 名球员并选择 2 支球队,他们将被分成 2 支 3 支球队,依此类推,但如果用户插入 7 名球员并将其分成 2 支球队,它将执行相同,但不会出现额外的玩家。我希望奇数的玩家总是出现在 tableView 的最后部分,用户插入的玩家数量为奇数,而其余部分为偶数。我在我的 func cellForRowAt 中尝试了不同的东西来实现这个但没有运气。这是我的代码:

import UIKit
import CoreData
import ChameleonFramework

class ShuffledTableViewController: UITableViewController {


override func viewDidLoad() {
    super.viewDidLoad()
    
    navigationController?.navigationBar.tintColor = UIColor.yellow
    loadedShuffledPlayers()
    tableView.reloadData()
    tableView.register(UINib(nibName: "ShuffledTableViewCell", bundle: nil), forCellReuseIdentifier: "shuffledCell")
    
}

//Player comes from core data
var shuffledPlayers = [Player]()

let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
var numberOfTeams = Int()

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return shuffledPlayers.count / numberOfTeams
    
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "shuffledCell", for: indexPath) as! ShuffledTableViewCell
    
    let rowsPerSection = shuffledPlayers.count / numberOfTeams
    let rowInSection = indexPath.row + rowsPerSection * indexPath.section
    
    cell.shuffledLabel.text = shuffledPlayers[rowInSection].names
    cell.shuffledLabel.textColor = UIColor.randomFlat().lighten(byPercentage: 10)
    cell.backgroundColor = UIColor.black
   
    
    return cell
}

func loadedShuffledPlayers(){
    
    let request: NSFetchRequest<Player> = Player.fetchRequest()
    do{
        shuffledPlayers = try context.fetch(request).shuffled()
    }catch{
        print("Error loading data from core data. \(error)")
    }
    
}

override func numberOfSections(in tableView: UITableView) -> Int {
    return numberOfTeams
}

override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return "Team # \(section + 1)"
    
}


override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int){
    
    let header = view as! UITableViewHeaderFooterView
    header.textLabel?.textColor = UIColor.white
}

}

//there is the problem, your number of rows in last section is wrong
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return shuffledPlayers.count / numberOfTeams
// if shuffledPlayers.count = 7 and numberOfTeams = 2, the result is 3
//so you should do something like that:
/*
* if section == numberOfTeams {
*    return shuffledPlayers.count % numberOfTeams + shuffledOlayers.count / numberOfTeams
* } else { 
*    return shuffledOlayers.count / numberOfTeams
* }
*/
}

假设我们有 11 players3 teams...

如果我们使用整数除法计算每队的球员数量,我们会得到 11 / 3 == 3 ...但是 3 名球员的 3 支球队(部分)只能得到 9 名球员,我们还有 2“剩余" 玩家。

因此,我们需要 3 个部分的结果,其中包含:

3 players
4 players (3 plus one of the leftovers)
4 players (3 plus one of the leftovers)

首先,让我们得到每队球员的 Integer 值:

// total number of players
let numPlayers = shuffledPlayers.count
    
// Integer value of players per team
let playersPerTeam = numPlayers / numberOfTeams

接下来,我们将使用模运算符来获取“额外玩家”:

// modulo (remainder) of "extra players"
let mod: Int = numPlayers % numberOfTeams
    

在这个 11 名球员/3 支球队的例子中,mod == 2,这意味着 最后 2 支球队 每支球队都需要一名额外的球员。

因此,我们检查球队 (section) 是否大于或等于球队数量减去“额外球员”的数量:

// if section is greater than or equal to
//  number of teams minus "extra players"
if section >= numberOfTeams - mod {
    // return players per team Plus 1
    return playersPerTeam + 1
}
// else return players per team
return playersPerTeam

完整的函数现在看起来像这样:

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

    // total number of players
    let numPlayers = shuffledPlayers.count
    
    // Integer value of players per team
    let playersPerTeam = numPlayers / numberOfTeams
    
    // modulo (remainder) of "extra players"
    let mod: Int = numPlayers % numberOfTeams
    
    // if section is greater than or equal to
    //  number of teams minus "extra players"
    if section >= numberOfTeams - mod {
        // return players per team Plus 1
        return playersPerTeam + 1
    }
    // else return players per team
    return playersPerTeam

}

当然,我假设您正在做自己的 user-entry 验证,以避免出现类似“7 名玩家分成 12 支球队”的情况。