【问题标题】:Swift Game How to call a variable from a different view controller classSwift Game 如何从不同的视图控制器类调用变量
【发布时间】:2017-07-27 19:39:54
【问题描述】:

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

这是我在第一个视图控制器中的随机化变量:

    @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)")
}

【问题讨论】:

    标签: ios swift xcode


    【解决方案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])")
    }
    

    【讨论】:

      【解决方案2】:

      您需要使用此功能,然后使用标识符设置从您的第一个视图控制器到第二个视图控制器的 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")
          }
      }
      

      【讨论】:

        【解决方案3】:

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

        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 的视图控制器访问数字,还可以从任何视图控制器随机化卡片,而无需复制处理随机化的函数。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-03-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多