Nano Hash - криптовалюты, майнинг, программирование

Передача данных между контроллерами представления приводит к нулю

Я новый программист и борюсь с передачей данных между контроллерами, я знаю, что этот вопрос задают на этих форумах, но загруженный код намного сложнее по сравнению с моим, и я изо всех сил пытаюсь его понять, поэтому загружу свои несколько строк, которые я написано. Я хочу разрешить двум игрокам вводить свои имена в мое приложение, а затем нажимать «Начать игру». когда нажата кнопка запуска игры, они переходят к новому контроллеру представления, у которого есть такие имена, как это Джо Блоггс против Джона Доу, я могу добиться этого, ЕСЛИ я сделаю свои переменные глобальными, но я понимаю, что это плохая практика, поэтому, когда я пытаюсь и написать тот же код, сохраняя переменные внутри контроллера представления, он каждый раз передает ноль, и я не уверен, что я сделал неправильно? Вот мои несколько строк кода, которые, я надеюсь, кто-то может ответить, что я делаю неправильно?

Вьюконтроллер:

import UIKit

class ViewController: UIViewController {

    var playerOneName: String!
    var playerTwoName: String!

    @IBOutlet weak var playerOneTextField: UITextField!
    @IBOutlet weak var playerTwoTextField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    @IBAction func startGameButton(_ sender: Any) {

        playerOneName = playerOneTextField.text!
        playerTwoName = playerTwoTextField.text!

    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "segue" {

            let destinationVC = segue.destination as! GameViewController
            destinationVC.playerOne.text = playerOneName
            destinationVC.playerTwo.text = playerTwoName
        }
    }

}

GameViewController:

import UIKit

class GameViewController: UIViewController {

    @IBOutlet weak var playerOne: UILabel!
    @IBOutlet weak var playerTwo: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.

    }

}

  • Вы проверили, правильно ли текстовые поля сопоставлены с переменными? Что, если prepare(for:sender:) вызывается перед обратным вызовом кнопки? 21.06.2017
  • Потому что playerOne становится nil, когда вы делаете destinationVC.playerOne.text = playerOneName. Другими словами, IBOulet еще не загружен. Создайте свойство String, которое будет содержать значение playerOneName. На viewDidLoad() установите на него playerOne.text. 21.06.2017
  • В Objective-C, но причина та же: > stackoverflow.com/questions/18137073/ или stackoverflow.com/questions/9576177/ 21.06.2017

Ответы:


1

Вы не можете установить свойства @IBOutlets до того, как ваш контроллер будет инициализирован. Вам нужно хранить такие значения, как String! во втором контроллере представления. И инициировать @IBOutlets с ними в методе viewDidLoad например.

Измените код GameViewController на этот:

import UIKit

class GameViewController: UIViewController {
    @IBOutlet weak var playerOne: UILabel!
    var playerOneName: String!     

    @IBOutlet weak var playerTwo: UILabel!
    var playerTwoName: String!

    override func viewDidLoad() {
        super.viewDidLoad()

        playerOne.text = playerOneName
        playerTwo.text = playerTextName
        // Do any additional setup after loading the view.
    }
}

И prepare в ViewController:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "segue" {
        let destinationVC = segue.destination as! GameViewController
        destinationVC.playerOneName = playerOneName
        destinationVC.playerTwoName = playerTwoName
    }
}

Надеюсь, поможет

21.06.2017

2

Вы не должны устанавливать текст метки непосредственно из другого контроллера представления, а должны создавать переменные в GameViewController для хранения текста метки, изменять эти переменные в переходе, а затем изменять метку в методе viewDidLoad целевого контроллера. См. код ниже.

class GameViewController: UIViewController {

    @IBOutlet weak var playerOne: UILabel!
    @IBOutlet weak var playerTwo: UILabel!

    var playerOneName:String?
    var playerTwoName:String?

    override func viewDidLoad() {
        super.viewDidLoad()
        playerOne.text = playerOneName
        playerTwo.text = playerTwoName
        // Do any additional setup after loading the view.

    }

}

И в ViewController:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "segue" {

            let destinationVC = segue.destination as! GameViewController
            destinationVC.playerOneName = playerOneName
            destinationVC.playerTwoName = playerTwoName
        }
    }
21.06.2017

3

Ваши выходы не будут инициализированы, пока не будет загружено представление вашего контроллера. Однако переход происходит до этого.

Лучшее решение — поместить пару строковых свойств в GameViewController и использовать их для получения данных от вашего первого контроллера. Затем обновите текст метки в viewDidLoad.

21.06.2017
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..