Как передать данные между контроллерами представления - не работает - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь передать счет игрока из VC1 в представление, которое отображает текущие результаты всех игроков (4). представление дисплея находится на отдельном контроллере представления, где счет игрока (ей) определен и сохранен.

Я выполнил подготовку (segue) и смог передать другие переменные в VC дисплея (ThirdViewController). но когда я пытаюсь присвоить игроку счет uilabel.text, он говорит мне, что я развернул ноль

Я даже пытался просто установить текст метки в статическую строку и все равно получить ошибку nil.

class ViewController: UIViewController {

var name = String()

var player1Score = 1
var player2Score = 2
var player3Score = 3
var player4Score = 4

//MARK: ********* IBOutlets **********
@IBOutlet weak var playerSegmentOutlet: UISegmentedControl!
@IBOutlet weak var diceSegmentOutlet: UISegmentedControl!
@IBOutlet weak var targetScoreSliderOutlet: UISlider!
@IBOutlet weak var matchTargetSwitchOutlet: UISwitch!
@IBOutlet weak var targetScoreLabel: UILabel!


override func viewDidLoad() {
    super.viewDidLoad()

}


override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    if let VC = segue.destination as? SecondViewController {

        VC.player1CurrentScore = player1Score
        VC.player2CurrentScore = player2Score
        VC.player3CurrentScore = player3Score
        VC.player4CurrentScore = player4Score
    }
}

Контроллер второго вида

class SecondViewController: UIViewController {

@IBOutlet weak var CurrentRoundScoreLabel: UILabel!

@IBOutlet weak var CurrentPlayerScoreLabel: UILabel!

var player1CurrentScore = 1
var player2CurrentScore = 1
var player3CurrentScore = 1
var player4CurrentScore = 1


override func viewDidLoad() {
    super.viewDidLoad()

}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let VC = segue.destination as? ThirdViewController {

        VC.player1ScoreLabel.text = String(player1CurrentScore)
        VC.player2ScoreLabel.text = String(player2CurrentScore)
        VC.player3ScoreLabel.text = String(player3CurrentScore)
        VC.player4ScoreLabel.text = String(player4CurrentScore)

    }
}

Контроллер третьего вида

class ThirdViewController: UIViewController {

@IBOutlet var player1ScoreLabel: UILabel!
@IBOutlet var player2ScoreLabel: UILabel!
@IBOutlet var player3ScoreLabel: UILabel!
@IBOutlet var player4ScoreLabel: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()
}

}

независимо от того, что я пытаюсь сделать с UILabel.text, он отображается как nil

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

1 Ответ

0 голосов
/ 21 января 2019

Это неэффективный способ сделать это, так как вы передаете данные через 3 разных объекта.Однако, продолжая эту методологию, проблема в том, что ярлыки еще не созданы внутри

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let VC = segue.destination as? ThirdViewController {

        VC.player1ScoreLabel.text = String(player1CurrentScore)
        VC.player2ScoreLabel.text = String(player2CurrentScore)
        VC.player3ScoreLabel.text = String(player3CurrentScore)
        VC.player4ScoreLabel.text = String(player4CurrentScore)

    }
}

Смотрите, ярлык еще не создан.Итак, вы устанавливаете text на UILabel, который не инициализирован.Поэтому вам нужно создать переменные для меток внутри ThirdViewController.

Контроллер третьего вида

class ThirdViewController: UIViewController {

    @IBOutlet var player1ScoreLabel: UILabel!
    @IBOutlet var player2ScoreLabel: UILabel!
    @IBOutlet var player3ScoreLabel: UILabel!
    @IBOutlet var player4ScoreLabel: UILabel!

    var score0:Int!
    var score1:Int!
    var score2:Int!
    var score3:Int!

    override func viewDidLoad() {
        super.viewDidLoad()
        self.player1ScoreLabel.text = String(score0)
        self.player2ScoreLabel.text = String(score1)
        self.player3ScoreLabel.text = String(score2)
        self.player4ScoreLabel.text = String(score3)
    }
}

и изменить последовательность в SecondViewController

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let VC = segue.destination as? ThirdViewController {

        VC.score0 = player1CurrentScore
        VC.score1 = player2CurrentScore
        VC.score2 = player3CurrentScore
        VC.score3 = player4CurrentScore

    }
}

Другой способ:

Давайте создадим синглтон с именем Game.В рамках этого (при условии, что у вас только 4 игрока) мы можем создать 4 игроков, которые никогда не изменятся .Это позволяет нам создавать экземпляры игроков в одном месте и вызывать их по мере необходимости.

ПРИМЕЧАНИЕ: Синглтон может быть использован неправильно ЛЕГКО.

https://cocoacasts.com/what-is-a-singleton-and-how-to-create-one-in-swift https://cocoacasts.com/are-singletons-bad/

class Game {

    static var score0:Int = 0
    static var score1:Int = 0
    static var score2:Int = 0
    static var score2:Int = 0

}        

Затем в любом месте вашего кода вы можете получить доступ к Game.score0, Game.score1.

ВНИМАНИЕ:

Я бы предостерег вас от очень осторожного использования синглетонов.Вы не хотите все с публичным доступом.Вы должны определить, хорошо это для вас или нет.Приветствия.

...