Строковая интерполяция или конкатенация не работают (быстро) - PullRequest
0 голосов
/ 04 августа 2020

У меня есть этот небольшой фрагмент кода в функции источника данных табличного представления func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell:

cell.textLabel?.text = "\(playerSorted[indexRow.path].username): \(playerSorted[indexRow.path].kills)"

, в котором .username - это строка, а .kills - это int. По какой-то причине в ярлыке может отображаться только имя пользователя. Я пробовал использовать убийства как строку, я пробовал использовать конкатенацию:

cell.textLabel?.text = playerSorted[indexRow.path].username + ": " + String(playerSorted[indexRow.path].kills

, но после .username ничего не отображается, даже двоеточие. Я пробовал помещать вещи перед .username, и по какой-то причине они появляются, например:

cell.textLabel?.text = "Player \(playerSorted[indexRow.path].username): \(playerSorted[indexRow.path].kills)"

или

cell.textLabel?.text = "Player " + playerSorted[indexRow.path].username + ": " + String(playerSorted[indexRow.path].kills

В этих случаях "Player" и .username отображается в метке на экране. Любой совет, который поможет с этой проблемой, был бы замечательным, я какое-то время застрял на нем. Спасибо за ваше время.

Полный класс collectionViewCell:

import UIKit

class CollectionViewCellRankings: UICollectionViewCell {
    

    
    @IBOutlet weak var tableViewInGame: UITableView!
    
    
    var teamsSorted = [Team]()
    var playersInYourTeam = [Player]()
    var playersSorted = [Player]()
    
    var cellNumber = 0
    
    override func awakeFromNib() {
        super.awakeFromNib()
    }
}

extension CollectionViewCellRankings: UITableViewDelegate, UITableViewDataSource{
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        switch cellNumber {
        case 0:
            return playersSorted.count
        case 1:
            return teamsSorted.count
        case 2:
            print("creating second cell")
            return playersInYourTeam.count
        default:
            return 0
            
        }
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "RankingCellTV")!
        cell.backgroundColor = UIColor.systemGray2
        
        switch cellNumber {
        case 0://FFA

            print("Kills:")
            print(playersSorted[indexPath.row].kills)

//Line that is causing the problems
            cell.textLabel?.text = "\(playersSorted[indexPath.row].username): \(playersSorted[indexPath.row].kills)"

        case 1://Team rankings
            if Game.teamSetting > 0 {
//This line of interpolation actually works! (no idea why)
                cell.textLabel?.text = "Team \(String(teamsSorted[indexPath.row].team!)): \(String(teamsSorted[indexPath.row].score!))"
                switch teamsSorted[indexPath.row].team {
                case 1:
                    cell.backgroundColor = UIColor.red
                case 2:
                    cell.backgroundColor = UIColor.blue
                case 3:
                    cell.backgroundColor = UIColor.green
                case 4:
                    cell.backgroundColor = UIColor.purple
                case 5:
                    cell.backgroundColor = UIColor.orange
                case 6:
                    cell.backgroundColor = UIColor.cyan
                case 7:
                    cell.backgroundColor = UIColor.yellow
                case 8:
                    cell.backgroundColor = UIColor.magenta
                default:
                    cell.backgroundColor = UIColor.systemBlue
                }
            }
        case 2://Players in team
            print("printing team player")
            cell.textLabel?.text = "\(playersInYourTeam[indexPath.row].username) | K: \(playersInYourTeam[indexPath.row].kills) D: \(playersInYourTeam[indexPath.row].deaths)"
        default:
            break
            
        }
        
        return cell
    }
        
    
    
    
}

Делегат представления коллекции класса UIViewController и методы источника данных:

extension InGameVC: UICollectionViewDelegate, UICollectionViewDataSource {
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        if Game.teamSetting > 0 {
            return 2
        } else {
            return 1
        }
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = inGameCV.dequeueReusableCell(withReuseIdentifier: "RankingCell", for: indexPath) as! CollectionViewCellRankings
        cell.backgroundColor = UIColor.systemGray2
        
        if indexPath.row == 0 {
            cell.tableViewInGame.backgroundColor = UIColor.systemGray2
            if Game.teamSetting > 0 {
                print(indexPath.row)
                cell.cellNumber = indexPath.row + 1
                cell.playersInYourTeam = playersInYourTeam
                cell.teamsSorted = teamsSorted
            } else {
                cell.cellNumber = 0
                cell.playersSorted = playersSorted
            }
            
        }
        cell.tableViewInGame.delegate = cell
        cell.tableViewInGame.dataSource = cell
       // cell.tableViewInGame.separatorStyle = UITableViewCell.SeparatorStyle.none
        cell.tableViewInGame.reloadData()
        return cell
    }
    
    

}

Player и Team являются структурами.

1 Ответ

0 голосов
/ 04 августа 2020

Итак, проверьте точно playerSorted [indexRow.path] .username. Он может заканчиваться переводом строки. Тогда вы не увидите убийств (и, кстати, точку с запятой).

...