![](/img/trans.png)
[英]Swift didSet called but not updating UILabel - iOS Property observer
[英]didSet observer does not get called when initialising property
鑒於以下課程,
class Spaceship {
var position: CGPoint! {
didSet {
node.position = position
}
}
var node: SKSpriteNode!
init(frame: CGRect) {
node = SKSpriteNode(
color: UIColor.red,
size: CGSize(
width: frame.size.width / 5,
height: frame.size.width / 5
)
)
self.position = CGPoint(x: frame.midX, y: frame.midY)
}
}
好像沒有調用position
屬性的didSet
觀察器。
由於didSet
觀察者應該在position
屬性被修改時設置SpriteKit節點的位置,所以我認為與其使用在didSet
塊中包含的同一行代碼,還可以觸發后者,但這似乎行不通。 當創建場景時(在主GameScene中,該場景僅創建一個Spaceship
對象,並將spaceship.node
添加到場景的子節點中),該node
的位置似乎為0; 0
0; 0
。
為什么會發生這種情況的任何線索? 謝謝。
更新:盡管defer
語句有效,但是賦值不允許使用它。
與其使用didSet
更新節點, didSet
直接向其轉發查詢:
class Spaceship {
let node: SKSpriteNode
init(frame: CGRect) {
self.node = SKSpriteNode(
color: UIColor.red,
size: CGSize(
width: frame.size.width / 5,
height: frame.size.width / 5
)
)
self.position = CGPoint(x: frame.midX, y: frame.midY)
}
var position: CGPoint {
get { return node.position }
set { node.position = newValue }
}
}
在調用超類初始化器之后,在子類初始化器中設置屬性時,將調用超類屬性的willSet和didSet觀察器。 在類設置其自己的屬性時 ,在調用超類初始化程序之前, 不會調用它們 。
一種可能的解決方案是將position
屬性設置在Spaceship
的初始化程序之外,或者也直接設置node
的位置。
我個人只是將Spaceship子類化為SKSpriteNode。 宇宙飛船似乎並不是一個復雜的對象,它涉及到繼承之上的合成。
class Spaceship : SKSpriteNode {
convenience init(frame: CGRect) {
self.init(
color: UIColor.red,
size: CGSize(
width: frame.size.width / 5,
height: frame.size.width / 5
)
)
self.position = CGPoint(x: frame.midX, y: frame.midY)
}
}
現在我不確定為什么要像這樣在幀中傳遞...。我假設幀是您的場景? 如果是這種情況,當錨點不是(0,0)時,您將遇到問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.