![](/img/trans.png)
[英]How do i access/pass variable from another view controller? It's not the next view controller, but the view controller after the next one in Swift
[英]How do I pass data from a View controller into my pop up view controller (swift/ios)
我对 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
并将其传递到我的 Popup 视图控制器中?
在您的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()
}
最好使用storyboard打开ViewController。 在故事板中,右键单击并从您的按钮拖动到第二个视图控制器(您希望打开的那个)。
选择您要使用的转场类型。 在您的情况下,我认为 Present Modally 会正常工作。
您将在故事板中看到两个 UIViewController 之间的一条线。 这就是赛格。 点击它。 在属性检查器中给 segue 一个标识符。 例如“myFirstSegue”。
然后在包含您的按钮的 UIViewController 代码中覆盖 prepare(for:sender:)。 在准备发生转场时调用此方法。 当你点击按钮时。 您可以访问目标 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 到其他 ViewController 的所有 segue 都会调用 prepare(for:sender:)
这很简单,只需在您的finalScoreViewController
添加一个属性(如果您还没有这样做)并且 - 例如 - 将其称为分数:
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)
}
}
希望有所帮助。
您实际上不必将变量传递给下一个视图控制器。 你所要做的就是在 View Controller 类之外创建一个变量,瞧,你可以从任何地方的任何 swift 文件中访问你的变量。 例如:
var score = 0
class ViewController: UIViewController {
override func viewDidLoad(){
super.viewDidLoad()
}
@IBAction func Button7Tapped(_ sender: AnyObject){
score += 1
}
}
然后在另一个 View Controller 中,您将拥有如下内容:
@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!"
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.