在以下 SwiftUI 代碼中,我有 3 個主要組件:
TestView- 持有一個TestClass實體,顯示MyShape并更新點擊時實體的計數TestClass。
TestClass- 一個用于存盤 a 的簡單類count,它在更改時發布。
MyShape- 一個簡單的形狀,其位置(應該)隨著TestClass實體數量的TestView變化而變化。
問題是計數更新時 的位置MyShape不會改變。
我知道計數正在更新,因為如果我在文本視圖中顯示計數,它會在點擊時發生變化,所以當計數發生變化時,當計數發生變化時形狀不會更新。為什么形狀沒有更新/為什么發布者沒有達到形狀?
struct TestView: View {
@ObservedObject var counter: TestClass = TestClass()
var body: some View {
ZStack {
MyShape(counter: counter)
.stroke(Color.red, lineWidth: 50)
.onTapGesture {
counter.count = 1
}
}
}
}
class TestClass: ObservableObject {
@Published var count = 0
}
struct MyShape: Shape {
var counter: TestClass
func path(in rect: CGRect) -> Path {
var path = Path()
path.move(to: CGPoint(x: 0, y: 0))
path.addLine(to: CGPoint(x: counter.count, y: counter.count))
return path
}
}
uj5u.com熱心網友回復:
SwiftUI 僅在其屬性更改時更新View或更新。Shape
現在,MyShape在第一次渲染后永遠不會改變它的屬性,因為TestClass它是一個參考型別(即class在這種情況下)——SwiftUI 只是看到屬性是相同的,并且不會費心渲染新版本的MyShape,即使其中一個內部上的屬性TestClass已更改。
在 aView中,我們可以使用@ObservedObject屬性包裝器,以便View知道在 aObservableObject的@Published屬性發生變化時進行更新(就像您在 中所做的那樣TestView),但是該包裝器在 中不可用Shape。
這里最簡單的解決方案是通過count而不是counter. count是一個Int(即一個值型別),這意味著只要它發生變化,SwiftUI 就會知道更新Shape:
struct TestView: View {
@ObservedObject var counter: TestClass = TestClass()
var body: some View {
ZStack {
MyShape(count: counter.count)
.stroke(Color.red, lineWidth: 50)
.onTapGesture {
counter.count = 1
}
}
}
}
class TestClass: ObservableObject {
@Published var count = 10
}
struct MyShape: Shape {
var count: Int
func path(in rect: CGRect) -> Path {
var path = Path()
path.move(to: CGPoint(x: 0, y: 0))
path.addLine(to: CGPoint(x: count, y: count))
return path
}
}
另一種可能更適合 SwiftUI 原理的替代解決方案是將您的模型更改為struct. 然后,可以將模型傳遞給 ,Shape并且由于它是值型別,因此Shape將更新。當然,這是假設您的現實世界模型更復雜并且具有多個Shape將需要的屬性 - 否則,保留僅公開其需要的原始解決方案(即Int)可能是一個更好的解決方案。
struct TestView: View {
@State var counter: TestStruct = TestStruct()
var body: some View {
ZStack {
MyShape(counter: counter)
.stroke(Color.red, lineWidth: 50)
.onTapGesture {
counter.count = 1
}
}
}
}
struct TestStruct {
var count = 10
}
struct MyShape: Shape {
var counter: TestStruct
func path(in rect: CGRect) -> Path {
var path = Path()
path.move(to: CGPoint(x: 0, y: 0))
path.addLine(to: CGPoint(x: counter.count, y: counter.count))
return path
}
}
注意:我更新了初始count,以便在開始時更容易點擊視圖
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/446767.html
