swift全局变量在另一个类中保持为null

时间:2017-01-21 03:49:38

标签: ios swift

所以,我使用swift,而且我很擅长这个。基本上发生的事情是当我在我的ViewController类中声明一个名为points的全局变量时,我给它一个值,当我在该类中打印它时,它会输出正确的值。我访问另一个类中的变量,它总是为空。我想访问变量的值。这是我的ViewController类。

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UITextFieldDelegate, UIScrollViewDelegate {

    @IBOutlet weak var points: UITextField! 

    @IBAction func playButton(_ sender: AnyObject) {
        let pts: Int? = Int(points.text!) //This is where I use points to covert it to an int

        if(pts == 0) {
            checkPoints.text = "Minimum points allowed is 1!"
        }else if(pts! > 50) {
        checkPoints.text = "Maximum points allowed is 50!"
    }else{
        checkPoints.text = ""
        let farray = arrayOfNames.filter() {$0 != ""}
        if(farray.count > 0) {
            print("Game starting")
            print(arrayOfNames.count)
        }else{
            print("No players added")
            print(farray.count)
        }
    }
}

这是我试图从中获取积分的课程。

class test1212: UIViewController {

var previousViewController: ViewController!

override func viewDidLoad() {
    super.viewDidLoad()
    previousViewController = ViewController()

}
@IBAction func test(_ sender: AnyObject) {
    //for testing purposes, instead of converting points to an int, I just print it's string value...which doesn't work
    print(previousViewController.points.text!)

}

提前致谢!

2 个答案:

答案 0 :(得分:2)

viewDidLoad的test1212 ViewController中,您有以下一行:

previousViewController = ViewController()

这样做是创建该视图控制器的新实例并将其分配给您的变量。这意味着您的points textField默认没有值。

您应该使用prepareForSegue进行此类数据传输的方式。当你从第一个控制器转到你的第二个控制器时,你应该做这样的事情:

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

    if segue.identifier == "mySegue" {

        if let destinationVC = segue.destination as? test1212 {

            destinationVC.pointsText = self.points.text

        }
    }
}

这需要您在test1212类中创建一个pointsText String变量,但是当您从第一个VC移动到第二个VC时,您可以轻松传递该值。

答案 1 :(得分:1)

您可以通过两种方式执行此操作,但不要为 ViewController()创建实例。

@Benjamin Lowry是建议的方式。 如果您想要遍布 ViewController()。,只需在 AppDelegate 中制作字符串(您想要的任何内容)。

声明你的财产

var point = String()

以上一行

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate 

然后直接将您的值分配给该属性。

 point = points.text!

在你的

playButton 操作方法。

并直接从 test1212

访问它
override func viewDidLoad() {
    super.viewDidLoad()
     print(point)

}

如果您不再需要,请不要忘记更新