Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/96.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 已传递的Segue变量在加载后保持清除状态_Ios_Iphone_Swift_Ios7 - Fatal编程技术网

Ios 已传递的Segue变量在加载后保持清除状态

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()

所以我一直在学习swift,我遇到了一个让我陷入困境的问题。我使用seques将数据从第一个控制器传递到第二个控制器

当我在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 ""
}
正如您在代码中看到的,这似乎很简单,但很明显,我不知道这是如何工作的,因为在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:Stringvar userId:Stringvar 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