传递的 Segue 变量在加载后保持清除
Passed Segue variable keeps clearing after load
所以我一直在努力学习 swift,我遇到了让我卡住了一段时间的问题。我正在使用序列将数据从第一个控制器传递到第二个控制器。
当我打印变量 onLoad 时,它会打印出传递的正确值,但是在我执行另一个函数(单击红色按钮)后,它不会打印出传递的值,而是打印出空白值。
var Level = 0;
var userId: String = "";
var clanId: String = "";
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
print(userId); //prints 97
print(clanId); //prins 2
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func redButtonClick(sender: AnyObject) {
print(userId); //prints ""
print(clanId); //prins ""
}
正如您在代码中看到的那样,它似乎非常简单,但显然我不知道它是如何工作的,因为在加载之后变量中没有任何内容。
感谢大家的帮助!
----------------编辑---------------------
更改了值 userId:String = "test"
更改了值 clanId:String = "test"
它现在在 onload 函数中打印出来
print(userId)
print(clanId)
results:
97
2
test
test
----------------添加------------
@IBAction func loginButton(sender: AnyObject) {
self.performSegueWithIdentifier("dashboard", sender: self);
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if(segue.identifier == "dashboard")
{
let dutydash:dashboardController = segue.destinationViewController as! dashboardController;
dutydash.userId = self.userId;
dutydash.clanId = self.clanId;
}
}
一对建议:
- 将
userId
和 clanId
的初始设置更改为其他设置而不是 ""
,例如 "test"
以查看是否存在问题
- 在Swift中,不需要在每行的末尾添加
;
- 所有变量都应该是驼峰式大小写(以小写字母开头),因此将
Level
更改为 level
下面是一个工作示例,确保您的数据设置在 prepareForSegue
。
class prevClass: UIViewController{
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "nextView" {
let destinationVC = segue.destinationViewController as! NextView
destinationVC.userId = "77789";
destinationVC.clanId = "Awesome Clan"
}
}
@IBAction func next(sender: AnyObject) {
self.performSegueWithIdentifier("nextView", sender: self)
}
}
class NextView: UIViewController {
var userId: String!
var clanId: String!
override func viewDidLoad() {
}
@IBAction func redButtonClick(sender: AnyObject) {
print(userId);
print(clanId);
}
}
我唯一能想到的是,您可能同时 运行 视图控制器的两个或多个实例。在 viewdidload 和按钮操作中打印 "self" 并检查两者是否相等。
所以我一直在努力学习 swift,我遇到了让我卡住了一段时间的问题。我正在使用序列将数据从第一个控制器传递到第二个控制器。
当我打印变量 onLoad 时,它会打印出传递的正确值,但是在我执行另一个函数(单击红色按钮)后,它不会打印出传递的值,而是打印出空白值。
var Level = 0;
var userId: String = "";
var clanId: String = "";
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
print(userId); //prints 97
print(clanId); //prins 2
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func redButtonClick(sender: AnyObject) {
print(userId); //prints ""
print(clanId); //prins ""
}
正如您在代码中看到的那样,它似乎非常简单,但显然我不知道它是如何工作的,因为在加载之后变量中没有任何内容。
感谢大家的帮助!
----------------编辑---------------------
更改了值 userId:String = "test" 更改了值 clanId:String = "test"
它现在在 onload 函数中打印出来
print(userId)
print(clanId)
results:
97
2
test
test
----------------添加------------
@IBAction func loginButton(sender: AnyObject) {
self.performSegueWithIdentifier("dashboard", sender: self);
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if(segue.identifier == "dashboard")
{
let dutydash:dashboardController = segue.destinationViewController as! dashboardController;
dutydash.userId = self.userId;
dutydash.clanId = self.clanId;
}
}
一对建议:
- 将
userId
和clanId
的初始设置更改为其他设置而不是""
,例如"test"
以查看是否存在问题 - 在Swift中,不需要在每行的末尾添加
;
- 所有变量都应该是驼峰式大小写(以小写字母开头),因此将
Level
更改为level
下面是一个工作示例,确保您的数据设置在 prepareForSegue
。
class prevClass: UIViewController{
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "nextView" {
let destinationVC = segue.destinationViewController as! NextView
destinationVC.userId = "77789";
destinationVC.clanId = "Awesome Clan"
}
}
@IBAction func next(sender: AnyObject) {
self.performSegueWithIdentifier("nextView", sender: self)
}
}
class NextView: UIViewController {
var userId: String!
var clanId: String!
override func viewDidLoad() {
}
@IBAction func redButtonClick(sender: AnyObject) {
print(userId);
print(clanId);
}
}
我唯一能想到的是,您可能同时 运行 视图控制器的两个或多个实例。在 viewdidload 和按钮操作中打印 "self" 并检查两者是否相等。