Как мне передать данные из контроллера представления в контроллер всплывающего окна (swift / ios)

#swift #viewcontroller

#swift #viewcontroller

Вопрос:

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

 @IBAction func Button7Tapped(_ sender: AnyObject)
    {
        if Index == 13 {
            game.score  = 1
        } else {
            let scorepopVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "finalScorePop") as! finalScoreViewController

            self.addChildViewController(scorepopVC)
            scorepopVC.view.frame = self.view.frame
            self.view.addSubview(scorepopVC.view)
            scorepopVC.didMove(toParentViewController: self)
        }
        updateGame()
    }
  

Выше приведен мой код для созданного мной внешнего контроллера всплывающего представления, который также имеет отдельный файл .swift. Как бы я мог взять game.score и передать это в свой контроллер всплывающего окна?

Комментарии:

1. Вы должны принять соответствующий ответ, если он решил вашу проблему.

Ответ №1:

В вашем finalScoreViewController файле swift добавьте новое свойство.

 final class FinalScoreViewController: UIViewController {
    var score: Int?


}
  

А затем просто назначьте его при создании экземпляра.

 @IBAction func Button7Tapped(_ sender: AnyObject) { 
    if Index == 13 {
        game.score  = 1
    } else { 
        let scorepopVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "finalScorePop") as! finalScoreViewController

        scorepopVC.score = game.score //THIS LINE

        self.addChildViewController(scorepopVC)
        scorepopVC.view.frame = self.view.frame
        self.view.addSubview(scorepopVC.view)
        scorepopVC.didMove(toParentViewController: self)
    }
    updateGame()
}
  

Ответ №2:

Для открытия ViewController лучше использовать storyboard. В раскадровке щелкните правой кнопкой мыши и перетащите с вашей кнопки на второй контроллер представления (тот, который вы хотите открыть).

Выберите тип перехода, который вы хотите использовать. В вашем случае, я думаю, что Present Модально будет работать нормально.

введите описание изображения здесь

Вы увидите строку между двумя UIViewControllers в раскадровке. Это переход. Нажмите на него. В инспекторе атрибутов укажите идентификатор segue. Например, «myFirstSegue».

введите описание изображения здесь

Затем в коде UIViewController, который содержит вашу кнопку, переопределите prepare(для:sender:). Этот метод вызывается при подготовке к переходу. io.w при нажатии на кнопку. У вас есть доступ к целевому UIViewController, и вы можете получить к нему доступ и установить для него свойства.

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "myFirstSegue" {
        if let vc = segue.destination as? MyViewController {
            //here you set your data on the destination view controller
            vc.myString = "Hello World"
        }
    }
}
  

Обратите внимание, что мы проверяем идентификатор, потому что все переходы, которые переходят от этого ViewController к другим ViewControllers, будут вызывать prepare(for:sender:)

Комментарии:

1. Вы переходите, не добавляя дочерний контроллер представления, как он сделал в своем примере кода.

Ответ №3:

Это довольно просто, просто добавьте свойство в свой finalScoreViewController (если вы еще этого не сделали) и, например, назовите его score:

 class finalScoreViewController: UIViewController {

    var score: String?

    // ...
  

Добавьте эту строку в Button7Tapped действие (где вы устанавливаете значение для оценки finalScoreViewController):

 let scorepopVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "finalScorePop") as! finalScoreViewController

        // add this line:
        scorepopVC.score = "My score"


        self.addChildViewController(scorepopVC)
        scorepopVC.view.frame = self.view.frame
        self.view.addSubview(scorepopVC.view)
        scorepopVC.didMove(toParentViewController: self)
  

Наконец, в finalScoreViewController :

 override func viewDidLoad() {
    super.viewDidLoad()

    if let scr = score {
        print(scr)
    }
}
  

Надеюсь, это помогло.

Комментарии:

1. Дополнительное примечание: соглашения об именовании , вы должны вызвать класс popup: «FinalScoreViewController» вместо «finalScoreViewController» (верхний регистр верблюда для именования классов).

2. @Antonio Chan Вот руководство по стилю Swift, которое может показаться вам интересным github.com/raywenderlich/swift-style-guide

Ответ №4:

На самом деле вам не нужно передавать переменную следующему контроллеру представления. Все, что вам нужно сделать, это создать переменную вне класса контроллера представления, и вуаля, вы можете получить доступ к своей переменной из любого места, в любом файле swift. Например:

 var score = 0

class ViewController: UIViewController {

    override func viewDidLoad(){
        super.viewDidLoad()
        
    }
    @IBAction func Button7Tapped(_ sender: AnyObject){
        score  = 1
    }
}
  

А затем в другом контроллере представления у вас будет что-то вроде этого:

 @IBOutlet weak var scoreLabel: UILabel!

class ViewController: UIViewController {
    override func viewDidLoad(){
        super.viewDidLoad()
        var timer1 = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(updateScore), userInfo: nil, repeats: true)
    }

@objc func updateScore() {
    scoreLabel.text = "You have (score) points!"
}