当从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
}
答案 0 :(得分:0)
我已经复制了您的代码并发现了一些错误,我在下面有一个工作示例,并认为我找到了您的问题。
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
语句只有一个空格。我将它们连接起来并将其更改为?
的条件转换。这样就更安全了。
@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-清洁并重建