#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!"
}