如何将数据从View控制器传递到我的弹出视图控制器(swift / ios)

时间:2016-10-10 08:15:06

标签: 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并将其传递到我的Popup视图控制器中?

4 个答案:

答案 0 :(得分:0)

最好使用storyboard打开ViewController。在故事板中,右键单击并从您按钮拖动到第二个视图控制器(您要打开的那个)。

选择您要使用的segue类型。在你的情况下,我认为Present Modally可以正常工作。

enter image description here

您将在故事板中看到两个UIViewControllers之间的一条线。这就是塞格。点击它。在“属性”检查器中,为segue指定标识符。例如“myFirstSegue”。

enter image description here

然后在UIViewController的代码中包含你的按钮覆盖prepare(for:sender :)。在准备发生segue时调用此方法。点击按钮时的I.o.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的所有segues都将调用prepare(for:sender :)

答案 1 :(得分:0)

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 :(得分:0)

这很简单,只需在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)
    }
}

希望有所帮助。

答案 3 :(得分:0)

您实际上不必将变量传递给下一个视图控制器。您所要做的就是在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!"
}    
相关问题