Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/93.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在另一个视图控制器中使用来自一个视图控制器的变量_Ios_Swift_Swift4_Xcode9 - Fatal编程技术网

Ios 在另一个视图控制器中使用来自一个视图控制器的变量

Ios 在另一个视图控制器中使用来自一个视图控制器的变量,ios,swift,swift4,xcode9,Ios,Swift,Swift4,Xcode9,我正在学习我的应用程序开发教程,并参与了一个Tic-Tac-Toe游戏。我绝对喜欢我的应用程序开发时间,并且已经用swift以外的其他几种语言编写了代码。当我允许用户在一个屏幕上输入他的/她的名字时(如下图第一幅图所示),当点击“播放”按钮时,它会将键入的名字保存到文本字段中,并将其与第二个视图控制器上的“'s turn”连接起来,以说明该用户是谁。在游戏结束时,我还希望通过名字显示谁是赢家。如果我在第二个视图控制器中找到如何使用第一个视图控制器中的用户数据,我将能够自己找到编码部分。我已经提到

我正在学习我的应用程序开发教程,并参与了一个Tic-Tac-Toe游戏。我绝对喜欢我的应用程序开发时间,并且已经用swift以外的其他几种语言编写了代码。当我允许用户在一个屏幕上输入他的/她的名字时(如下图第一幅图所示),当点击“播放”按钮时,它会将键入的名字保存到文本字段中,并将其与第二个视图控制器上的“'s turn”连接起来,以说明该用户是谁。在游戏结束时,我还希望通过名字显示谁是赢家。如果我在第二个视图控制器中找到如何使用第一个视图控制器中的用户数据,我将能够自己找到编码部分。我已经提到:但我仍然不明白这是如何工作的,或者它是否与我遇到的问题相同。我将附上下面两个视图控制器的图片及其代码。提前谢谢你的帮助

两个视图控制器

获取用户输入的视图控制器的代码:

// MainViewController.swift
// Tic Tac Toe
// main menu/player select

import UIKit

class MainViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet weak var playerOneName: UITextField!
    @IBOutlet weak var playerTwoName: UITextField!

    @IBAction func play(_ sender: Any) {

    }

    override func viewDidLoad() {
        super.viewDidLoad()

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()

        return true
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.view.endEditing(true)
    }

}
还请注意,我已尝试使用以下方法将数据保存到用户设备上:

UserDefaults.standard.set(playerOneName.text forKey: "playerone")

我在这里也看到了一个类似的问题,说明变量是公共的,可以在整个过程中使用,我的问题是我希望在按下按钮时保存名称,并且声明它们为公共/静态也不起作用

我建议使用第三类来提取玩家信息,并将其设置为Singleton。大概是这样的:

class Players {
    static let shared = Players()

    var one: String {
        get {
            return UserDefaults.standard.object(forKey: "playerone") as? String ?? ""
        }
        set(newValue) {
            UserDefaults.standard.set(newValue, forKey: "playerone")
        }
    }
}
Players.shared.one = "Name one"
print(Players.shared.one)
和访问/设置相同,如下所示:

class Players {
    static let shared = Players()

    var one: String {
        get {
            return UserDefaults.standard.object(forKey: "playerone") as? String ?? ""
        }
        set(newValue) {
            UserDefaults.standard.set(newValue, forKey: "playerone")
        }
    }
}
Players.shared.one = "Name one"
print(Players.shared.one)

你到底需要什么来公开或只为两个vc存储值?@PravinTate被你的问题弄糊涂了,但我想保存玩家在第一个vc上键入的两个名字,并在第二个vc中使用它们。如果你还需要解释,请告诉我。在第一个vc中获得两个玩家的名字并点击播放按钮后,创建一个模式,使用数组存储两个玩家的名字,然后为第二个vc编写init方法并将其传递给该模式。@Praventate好的,这一切对我来说都是有意义的,但是init方法。你知道什么,我可以熟悉它来使用它吗?顺便谢谢你的帮助!检查下面的答案,我试图解释你。这个类是在VC的主菜单,还是游戏?如果它像我假设的那样在主菜单中,我将能够像你所说的那样通过:Players.shared.one=“Name one”print(Players.shared.one)访问它?你可以在你的项目中的任何地方声明/访问这个类:一个新文件或VC类文件的结尾,这只是一个附带问题,因为我还是新的,setter/getter方法也应该在应用程序开发中使用吗?非常感谢!我会处理这个。这将有助于解决未来的许多问题,很高兴知道这一点。非常感谢你们两位的帮助@Jeremy Carthur您可以在任何您认为有帮助的地方使用getter/setter。除此之外没有任何限制