我是編程新手,Swift 是我正在學習的第一門編程語言,如果問題的答案太明顯,我深表歉意。我的應用程式需要添加玩家數量以及用戶希望將玩家分成的團隊數量。使用偶數時,我的 tableView 作業正常,如果用戶插入 6 名球員并選擇 2 支球隊,他們將被分成 3 人的 2 支球隊,依此類推,但如果用戶插入 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
}
}
uj5u.com熱心網友回復:
假設我們有11 players并且3 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 運算子來獲取“額外玩家”:
// 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
}
當然,我假設您正在進行自己的用戶輸入驗證,以避免出現“7 名玩家分成 12 支球隊”之類的情況。
uj5u.com熱心網友回復:
//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
* }
*/
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/442889.html
