在viewWillAppear()中获取空值但在viewDidLoad()中获取有效值

时间:2018-03-07 12:15:50

标签: ios swift

当从print(mess)函数调用viewDidLoad时,它会打印出预期的内容,但是当从viewWillAppear函数调用时,它会给出空输出。在viewDidLoad中完成作业后,标签也没有得到更新。为什么会这样?

主ViewController:

if segue.identifier == "temp"
{
let tovc = segue.destination as ! ADDviewcontroller1
tovc.mess = self.var1
}

在ADDviewcontroller1中:

var mess: String = ""
override func viewWillAppear(animated: Bool)
{
super.viewWillAppear(animated)
self.infoLabel.text = mess
print(mess) //giving empty output in console
}

override func viewDidLoad()
{
super.viewDidLoad()
self.infoLabel.text = mess //label not getting updated

print(mess) //printing the required output in console
}

2 个答案:

答案 0 :(得分:0)

我已经复制了您的代码并发现了一些错误,我在下面有一个工作示例,并认为我找到了您的问题。

第一个viewcontroller(ViewController)

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "show" {
        let tovc = segue.destination as? AddViewController
        tovc?.mess = "test"
    }
}

注意:我已将标识符重命名为show,将其重命名为代码中的标识符。我还使用字符串"test"替代var1

在第一个viewcontroller中,您必须使用您提供的代码覆盖prepare(for:sender:) func。请注意,!距离as语句只有一个空格。我将它们连接起来并将其更改为?的条件转换。这样就更安全了。

第二个viewcontroller(AddViewController)

@IBOutlet weak var infoLabel: UILabel!

var mess: String = ""
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.infoLabel.text = mess
    print(mess) //this is now printing 'test'
}

override func viewDidLoad() {
    super.viewDidLoad()
    self.infoLabel.text = mess //label is now being set

    print(mess) //this is now printing 'test'
}

请注意_ func签名中缺少的额外viewWillAppear(animated:)。没有遵循签名可以不像你期望的那样被解雇(因为系统不会将viewWillAppear识别为有效覆盖)。

使用 Swift 4 在最新的 Xcode(9.2)中运行此代码我没有遇到任何问题,无法重现您的问题(如果它不是'错过viewWillAppear的签名。如果你仍然遇到麻烦,我猜这个问题就是当地问题。

答案 1 :(得分:-1)

非可选值不可能产生'nil',但它可能是Xcode中的错误尝试:

1-清除衍生数据文件夹:https://stackoverflow.com/a/18933382/3882414

2-重启Xcode

3-清洁并重建