Очки по-прежнему остаются 0, потому что вы сохраняете их, во-первых, вам нужны очки для каждого игрока, поэтому вам нужно объединить имя игрока и счет в объект.
class Player:NSObject, Codable{
let name: String
var score : Int
init(name: String, score: Int) {
self.name = name
self.score = score
}
override var description: String{
return "Name :" + self.name + " Score :" + String(self.score )
}
}
Swift 4 представил протокол Codable,Принятие Codable для ваших собственных типов позволяет вам сериализовать их в любой из встроенных форматов данных и из них.
Теперь вы можете легко получить доступ к плееру с именем и счетом.
var players = [Player]()
Чтобы получить сохраненное значение из UserDefaults
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if let items: Data = UserDefaults.standard.object(forKey: "items") as? Data{
self.players = try! PropertyListDecoder().decode([Player].self, from: items)
self.listTableView.reloadData()
}
}
Когда вы добавляете нового игрока в свой список, создайте новый экземпляр Player
и добавьте его в список.
func alert(){
let alert = UIAlertController(title: "Add Player", message: "", preferredStyle: .alert)
alert.addTextField{
(textfield) in
textfield.placeholder = " Enter Player Name "
}
let add = UIAlertAction(title: "Add", style: .default)
{
(action) in guard let textfield = alert.textFields?.first else {return}
if let newText = textfield.text
{
let player = Player(name: newText, score: 0)
self.players.append(player)
let indexPath = IndexPath(row: self.players.count - 1, section: 0)
self.listTableView.insertRows(at: [indexPath], with: .automatic)
}
}
let cancel = UIAlertAction(title: "Cancel", style: .cancel) {
(alert) in
}
alert.addAction(add)
alert.addAction(cancel)
present(alert, animated: true, completion: nil)
}
Теперь обновитеВаш метод UITableViewDataSource
как новый элемент списка.
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! PointsCell
cell.player = players[indexPath.row]
return cell
}
теперь необходимо обновить метод saveData
для сохранения нового списка в UserDefaults, этот метод вызывается всякий раз, когда вы хотите сохранить свой список.
func saveData() {
UserDefaults.standard.set(try! PropertyListEncoder().encode(self.players), forKey: "items")
}
PointsCell
класс также необходимо обновить как новый тип объекта:
class PointsCell: UITableViewCell {
@IBOutlet weak var scoreUILabel: UILabel!
@IBOutlet weak var nameUILabel: UILabel!
var player: Player? {
didSet{
if let name = player?.name {
self.nameUILabel?.text = name
}
if let score = player?.score {
self.scoreUILabel?.text = String(score)
}
}
}
@IBAction func pointbuttonPressed(_ sender: Any) {
if self.player != nil{
let score = self.player?.score ?? 0
self.player?.score = score + 1
scoreUILabel.text = String(self.player?.score ?? 0)
}
}
}