【发布时间】:2017-03-21 15:38:55
【问题描述】:
我正在尝试创建一个可以调用的函数来更新我的 UILabel 的scoreLabel.text。但是,每当我尝试更改它时都会出现错误。令我困惑的是,在viewDidLoad() 中更改它时没有收到错误消息。其他任何地方都返回以下错误:
在控制台中我也收到错误:
致命错误:在展开 Optional 值时意外发现 nil。
所以我一直相信,当调用我的函数来更新文本时,视图还没有加载 UILabel。但我确定只有在视图已加载后才会调用此函数。
我检查过/尝试过的事情:
- 我的 IBOutlet 已正确连接
- 我的函数正在被调用
- 同时使用
scoreLabel.text和self.scoreLabel.text - 使用强和弱插座连接
我也很肯定 changeTextLabel 在 scoreLabel 加载到内存后被调用。但是我的错误似乎又说明了其他问题。
这是我的代码的完整标记。为了便于阅读,我删除了一些不相关的细节:
import UIKit
import SpriteKit
class GameViewController: UIViewController {
@IBOutlet weak var scoreLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
//This is where all my other code was
print(scoreLabel.text)
scoreLabel.text = "Testing" //This line can be run
}
func changeTextLabel() {
print("changeTextLabel called")
if self.scoreLabel != nil {
self.scoreLabel.text = "yay"
} else {
print("scoreLabel is nil") //This is called every time
}
}
}
感谢您的宝贵时间
编辑:GameScene.swift
这只是应该关注的部分
func projectileDidCollideWithMonster(projectile: SKSpriteNode, monster: SKSpriteNode) {
print("Hit")
let storyBoard = UIStoryboard(name: "Main", bundle: nil)
let object = storyBoard.instantiateViewController(withIdentifier: "GameViewController") as! GameViewController
object.changeTextLabel()
projectile.removeFromParent()
monster.removeFromParent()
}
【问题讨论】:
-
您是否尝试打印
self.scoreLabel以检查其是否为零? -
你在哪里从其他控制器调用
changeTextLabel方法? -
检查断点是先调用 viewdidload 还是先调用 changetextlabel。
-
是否有必要在你的
func中的变量上调用self? -
@Tj3n 是的,从
changeLabelText()调用时值为nil,但从viewDidLoad()调用时值为Testing并且是普通字符串
标签: ios swift sprite-kit uikit uilabel