Как правильно передать значения между классами в Swift? - PullRequest
2 голосов
/ 18 апреля 2019

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

Ниже приведен код класса, который позволяет мне выбрать класс моего игрока

    import UIKit

    class ClassSelectionController: UIViewController
    {
        //Default class values
        var character = (0, 0, "", 0)

        override func viewDidLoad()
        {
                super.viewDidLoad()
                // Do any additional setup after loading the view.
        }

        //class button actions
        @IBAction func fighterBtn(_ sender: Any)
        {
                character = (50, 60, "Steal Sword", 18)
                performSegue(withIdentifier: "Character", sender: self)
        }

        @IBAction func wizerdBtn(_ sender: Any)
        {
                character = (25, 70, "Staff", 15)
                performSegue(withIdentifier: "Character", sender: self)
        }

        @IBAction func thiefBtn(_ sender: Any)
        {
                character = (30, 60, "Dagger", 18)
                performSegue(withIdentifier: "Character", sender: self)
        }

        @IBAction func archerBtn(_ sender: Any)
        {
                character = (50, 60, "Bow & Arrow", 16)
                performSegue(withIdentifier: "Character", sender: self)
        }


        override func prepare(for segue: UIStoryboardSegue, sender: (Any)?)
        {
                //code for segue
                var vc = segue.destination as! ViewController
                vc.finalCharacter = self.character
        }

    }

И это класс, который получает данные для класса игрока и отображает их.

    import UIKit

    class ViewController: UIViewController
    {
            var finalCharacter = (0, 0, "", 0)
            //****************************************
            //Setup for outlets go between these lines
            //****************************************
            @IBOutlet weak var healthLabel: UILabel!
            @IBOutlet weak var damageLabel: UILabel!
            @IBOutlet weak var weaponLabel: UILabel!
            @IBOutlet weak var armorLabel: UILabel!
            @IBOutlet weak var storyLabel: UILabel!
            @IBOutlet weak var actionButton: UIButton!


            @IBOutlet weak var northBtn: UIButton!
            @IBOutlet weak var southBtn: UIButton!
            @IBOutlet weak var eastBtn: UIButton!
            @IBOutlet weak var westBtn: UIButton!

            //****************************************
            //Setup for outlets go between these lines
            //****************************************


            override func viewDidLoad()
            {
                    super.viewDidLoad()
                    // Do any additional setup after loading the view.

                    healthLabel.text = "Health: \(finalCharacter.0)"
                    damageLabel.text = "Damage: \(finalCharacter.1)"
                    weaponLabel.text = "Weapon: " + finalCharacter.2
                    armorLabel.text  = "Armor : \(finalCharacter.3)"
            }

            //****************************************
            //Setup for buttons go between these lines
            //****************************************
            @IBAction func actionButton(_ sender: Any)
            {

            }

            @IBAction func northButton(_ sender: Any)
            {

            }

            @IBAction func southButton(_ sender: Any)
            {

            }

            @IBAction func eastButton(_ sender: Any)
            {

            }

            @IBAction func westButton(_ sender: Any)
            {

            }
    //****************************************
    //Setup for buttons go between these lines
    //****************************************
    }

Несмотря на то, что мой код в настоящее время не показывает его, я поместил значения печати в кнопки класса просто для того, чтобы посмотреть, изменились ли значения при выборе класса, и я увидел, что они меняются, когдакнопка нажата.Я также просмотрел ViewController и изменил значения finalCharacter, просто чтобы посмотреть, повлияло ли это на что-то, чего не произошло.Таким образом, мое обоснованное предположение состоит в том, что проблема должна быть в ClassSelectionController.

Поэтому основная проблема заключается в том, что я нажму на класс игрока-мастера, и я ожидаю, что появится статистика классов для мастера (Т.е. 25, 70, "Staff", 15), но я получу только значения по умолчанию, которые есть в ClassSelectionController (0, 0, "", 0).

1 Ответ

2 голосов
/ 18 апреля 2019

Что происходит здесь, когда у вас есть несколько UIStoryboardSegue с именем «Персонаж», связанных с каждой кнопкой

, так что происходит, когда вы нажимаете кнопку, Segue вызывается перед кнопкой «Действие» и, кроме того, UIStoryboardSegue вызывается снова (если вы поместите отладчик в viewDidLoad, вы увидите, что он идет туда два раза).

Решение

  • Удалитьвсе UIStoryboardSegue связаны с кнопками
  • Создайте новый UIStoryboardSegue из ClassSelectionController для следующего ViewController назовите его 'Character' see here

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

override func prepare(for segue: UIStoryboardSegue, sender: (Any)?)
    {
        if (segue.identifier == "Character") {
            let vc = segue.destination as! ViewController
            vc.finalCharacter = self.character
        }
    }

...