【问题标题】:Error trying to transfer data from variable between storyboards尝试从情节提要之间的变量传输数据时出错
【发布时间】:2016-04-15 16:33:34
【问题描述】:

我有一个游戏,我在第一个视图控制器中将玩家的高分值存储为“highScore”。

我想做的是尝试将此变量数据传输到第二个视图控制器。

我在第一个视图控制器的情节提要中输入了以下代码。

顺便说一句,highscore2 是我在第二个视图控制器中定义的变量,用于存储来自第一个 highscore 变量的数据。:

override func prepareForSegue(segue: UIStoryboardSegue!, sender:AnyObject!)
{
           if (segue.identifier == "segueTest")
            {
                var svc = segue!.destinationViewController as! viewTwo;

                svc.highScore2 = "High Score \(highScore)"

            }
 }

现在这是我的第二个视图控制器 (viewTwo) 中的代码:

class viewTwo: UIViewController
{



    @IBOutlet var highScoretwolbl: UILabel!

    var highScore2:String!



    override func viewDidLoad() {
            highScoretwolbl.text = highScore2
    }
}

由于某种原因,代码编译了,但是高分没有显示,并且是“nil”。

【问题讨论】:

  • 您使用的是哪种类型的segue?显示(推送),显示详细信息(替换),模态显示,弹出框?如果是show,那么它应该可以工作!

标签: ios swift variables storyboard segue


【解决方案1】:

避免强制展开。

if let svc = segue.destinationViewController as? viewTwo{
    svc.highScore2 = "High Score \(highScore)"
}

然后放置一个断点并确保您到达所有这些行。

【讨论】:

    【解决方案2】:

    如其他答案所述,viewDidLoad 只会被触发一次。自从你 正在使用强制展开的字符串,它最初为 nil。它 (highScore2) 不会得到一个值,直到您设置它 viewDidLoad 之后发生。添加一些打印语句,以便您可以看到事件的顺序。

    您最好的选择是使用 viewWillAppear。每次都会被解雇 您的视图出现。这就是你想要的。

    您不需要使用强制解包变量。只需制作一个字符串 最初将其设为空。

    override func prepareForSegue(segue: UIStoryboardSegue, sender:AnyObject?)
    {
       if segue.identifier == "segueTest"
       {
            if let svc = segue.destinationViewController as? viewTwo {
                print("setting score in prepareForSegue")
                svc.highScore2 = "High Score \(highScore)"
            }
            else {
                print("something bad happened")
            }
        }
    }
    
    
    class viewTwo: UIViewController
    {
    
    
        @IBOutlet var highScoretwolbl: UILabel!
    
        // The following uses forced upwrapping which means it could be nil
        // if you never set it and your app will crash.
        // var highScore2: String!
        // Instead, do this:
        var highScore2: String = ""
    
        override func viewWillAppear(animated: Bool) {
            // putting this here will ensure that every time the screen
            // is shown, the label will get set from the string.
            highScoretwolbl.text = highScore2
        }
    }
    

    【讨论】:

    • 而不是 viewWillAppear,你是说 viewDidLoad 吗?它说它不能覆盖该函数,因为没有名为 viewWillAppear 的函数可以覆盖。
    • 我的错,我忘了将参数添加到函数中。但由于某种原因,它仍然显示一个空白文本字段
    • 这是正确的做法。您将不得不对此进行调试。一路添加打印语句以查看正在传递和接收的值。这是一个有效的简单示例:github.com/ryantxr/legendary-potato
    • 方法签名好像有误。你有这个:prepareForSegue(segue: UIStoryboardSegue!, sender:AnyObject!)。应该是这样的:prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
    【解决方案3】:

    如果我没记错的话,viewDidLoad 方法在视图控制器第一次初始化时只被调用一次。所以你在highScore2实际上有任何数据之前设置了highScoretwolbl变量,这就是为什么它是nil。

    我建议将文本设置在 viewWillAppear 中,以便每次发生转场时都会更新。

    类似

     override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(true)
        highScoretwolbl.text = highScore2
    }
    

    这里引用了一个视图控制器的所有方法的生命周期。 View controller lifecycle

    【讨论】:

    • 由于某种原因,它仍然显示一个空白文本字段
    猜你喜欢
    • 1970-01-01
    • 2012-10-09
    • 1970-01-01
    • 2016-10-17
    • 2012-06-02
    • 1970-01-01
    • 2013-10-27
    • 2020-05-08
    • 2016-12-22
    相关资源
    最近更新 更多