所以,我使用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!)
}
提前致谢!
答案 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)
}
如果您不再需要,请不要忘记更新点。