Swift Game如何从不同的视图控制器类调用变量

时间:2017-07-27 19:39:55

标签: ios swift xcode

我制作了这款纸牌游戏应用。因此,首先游戏随机化四张卡片,这些卡片稍后将在不同的视图控制器中使用。我的第二个视图控制器将显示和使用随机卡。我做的是我在第一个视图控制器中有一个arc4random函数并将其设置为一个变量,然后我想使用这些变量在第二个视图控制器中显示。问题是我无法使用从一个视图控制器到另一个视图控制器的变量。

这是我在第一个视图控制器中的randomize var:

    @IBAction func randomizeButtonTapped(_ sender: UIButton) {

    //randomize function
    var firstNumber =  arc4random_uniform(13) + 1
    firstCardImageView.image = UIImage(named: "card\(firstNumber)")

    var secondNumber = arc4random_uniform(13) + 1
    secondCardImageView.image = UIImage(named: "card\(secondNumber)")

    var thirdNumber = arc4random_uniform(13) + 1
    thirdCardImageView.image = UIImage(named: "card\(thirdNumber)")

    var fourthNumber = arc4random_uniform(13) + 1
    forthCardImageView.image = UIImage(named: "card\(fourthNumber)")

这是我第二个视图控制器上的代码:

    @IBAction func firstButtonTapped(_ sender: UIButton) {

    label.text = label.text + String("\(firstNumber)")
}

3 个答案:

答案 0 :(得分:1)

在FirstVC中,将变量作为全局变量添加到类的顶部:

var cards = [Int]()

在SecondVC中创建相同的变量:

var cards = [Int]()

在FirstVC中添加此方法:

override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
    if let secondVC = segue.destination as? YourSecondVC {
        secondVC.cards = self.cards
    }
}

此方法将在显示SecondVC之前调用。基本上它将卡从第一个VC分配给第二个VC的卡。

然后你的方法将如下所示:

@IBAction func firstButtonTapped(_ sender: UIButton) {
   label.text = label.text + String("\(cards[0])")
}

答案 1 :(得分:0)

您需要使用此功能,然后使用标识符从第一个视图控制器到第二个视图控制器设置一个segue。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    switch segue.identifier {
    case "YOUR_SEGUE_IDENTIFIER"?:
        let destination = segue.destination as! UIViewController()
        destination.VARIABLE_NAME_ON_NEXT_VC = VARIABLE_YOU_ARE_PASSING
    default:
        print("dont know where to send in segue")
    }
}

答案 2 :(得分:0)

你可以采用的一种方法是创建一个辅助类来处理卡的随机化。然后在不同的视图控制器中可以使用相同的数字。像这样:

class CardService {

    static let instance = CardService()
    private(set) var cards = [UInt32]()

    func randomizeCards() {
       cards.removeAll()
        for _ in 0...3 {
            let num = arc4random_uniform(13) + 1
            cards.append(num)
        }
    }
}

然后在第一个视图控制器中点击按钮时调用:

CardService.instance.randomizeCards()

在您想要使用数字的视图控制器中,您可以通过索引访问它们,如下所示:

CardService.instance.cards[0]

这里的好处是您可以从任何视图控制器访问带有或不带segue的数字,也可以从任何视图控制器随机化这些卡,而无需复制处理随机化的功能。