Ios 已传递的Segue变量在加载后保持清除状态
所以我一直在学习swift,我遇到了一个让我陷入困境的问题。我使用seques将数据从第一个控制器传递到第二个控制器 当我在onLoad上打印变量时,它会打印出传递的正确值,但是在我执行另一个函数(单击红色按钮)后,它不会打印出传递的值,而是打印空白值Ios 已传递的Segue变量在加载后保持清除状态,ios,iphone,swift,ios7,Ios,Iphone,Swift,Ios7,所以我一直在学习swift,我遇到了一个让我陷入困境的问题。我使用seques将数据从第一个控制器传递到第二个控制器 当我在onLoad上打印变量时,它会打印出传递的正确值,但是在我执行另一个函数(单击红色按钮)后,它不会打印出传递的值,而是打印空白值 var Level = 0; var userId: String = ""; var clanId: String = ""; override func viewDidLoad() { super.viewDidLoad()
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 ""
}
正如您在代码中看到的,这似乎很简单,但很明显,我不知道这是如何工作的,因为在onload之后,变量中不包含任何内容
谢谢大家的帮助
------------------编辑----------------------
已更改值userId:String=“test”
更改了值clanId:String=“test”
它现在在onload函数中打印出来
print(userId)
print(clanId)
results:
97
2
test
test
----------------加成-----------
几点建议:
- 将
和userId
的初始设置更改为其他设置,而不是clanId
”,如“
,以查看这是否有问题“test”
- 在Swift中,您不需要
代码>在每行末尾
- 所有变量都应该是驼峰大小写(以小写字母开头),因此将
更改为Level
Level
- 将
和userId
的初始设置更改为其他设置,而不是clanId
”,如“
,以查看这是否有问题“test”
- 在Swift中,您不需要
代码>在每行末尾
- 所有变量都应该是驼峰大小写(以小写字母开头),因此将
更改为Level
Level
- 下面是一个工作示例,请确保您的数据是在
prepareforsgue
中设置的
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);
}
}
下面是一个工作示例,请确保在
prepareforsgue
中设置数据
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);
}
}
我唯一能想到的是,您可能正在同时运行视图控制器的两个或多个实例。在ViewDiLoad和按钮操作中打印“self”,并检查两者是否相等。我唯一能想到的是,您可能同时运行两个或多个view controller实例。在viewdidload和按钮操作内部打印“self”,并检查两者是否相等。我将其更改为test,现在我得到打印输出(在onload函数期间)97 2 test test,然后当我单击其他函数时,我得到testOk,因此发生的情况是,由于VC的生命周期,它们再次被分配。正如@kye提到的,您可以将它们更改为
var userId:String如果你确定它们会被另一个VC设置,否则你会崩溃。我在上面评论了他的雄蕊。它抛出一个错误,指出它在解包可选值时发现了一个nil。您的代码中是否还有其他内容涉及这些变量?我将其更改为test,现在我得到了打印输出(在onload函数期间)97 2 test test,然后当我单击其他函数时,我得到testOk,所以现在的情况是,由于VC的生命周期,他们又被分配了。正如@kye提到的,您可以将它们更改为var userId:String如果你确定它们会被另一个VC设置,否则你会崩溃。我在上面评论了他的雄蕊。它抛出一个错误,指出它在展开可选值时发现了一个nil。您的代码中是否还有其他内容涉及这些变量?您是否尝试过不初始化userId和clanId?(var userId:String!var clanId:String!
)单击按钮时,它们可能会重置为其原始值?在进行这些更改后,我收到以下消息:97 2致命错误:在展开可选值时意外发现零,那么如果我添加了?而不是我得到输出92,2,nil,nil请分享一些来自第一个控制器的代码,什么时候以及如何转换到destination@Aamir我已经把它添加到了主要问题中,您正在代码中设置userID和companyID,而不是clanId您是否尝试过不初始化userID和clanId?(var userId:String!var clanId:String!
)单击按钮时,它们可能会重置为其原始值?在进行这些更改后,我收到以下消息:97 2致命错误:在展开可选值时意外发现零,那么如果我添加了?而不是我得到输出92,2,nil,nil请分享一些来自第一个控制器的代码,什么时候以及如何转换到destination@Aamir我已经把它添加到了主要问题中,您在代码中设置的是userID和companyID,而不是clanID