我是一名設計師,他正在嘗試學習 SwiftUI 以獲得樂趣,同時確保我了解更多我的開發團隊需要我做什么。
還有一些非常簡單的事情我做不到!
正如您從下面的這段代碼中看到的那樣,我只想在 var showHello 為真時顯示一個文本,并且它運行良好。
import SwiftUI
struct ContentView: View {
@State var showHello = true
var body: some View {
VStack {
Spacer()
Button("Show Hello", action: { showHello.toggle() })
.padding()
Spacer()
Text("This is your message:")
.padding()
if showHello == true {
Text("Hello")
} else {
Text("Hello")
.opacity(0)
}
Spacer()
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
但是當我想通過使用多個視圖來做完全相同的事情時,它就行不通了!
// Parent file
import SwiftUI
struct ContentView: View {
var body: some View {
VStack {
TopView()
BottomView()
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
// Child file 1
import SwiftUI
struct TopView: View {
@State var showHello = true
var body: some View {
Button("Show Hello", action: { showHello.toggle() })
.padding()
}
}
struct TopView_Previews: PreviewProvider {
static var previews: some View {
TopView()
}
}
// Child file 2
import SwiftUI
struct BottomView: View {
var body: some View {
Text("This is your message:")
if showHello == true {
Text("Hello")
} else {
Text("Hello")
.opacity(0)
}
}
}
struct BottomView_Previews: PreviewProvider {
static var previews: some View {
BottomView()
}
}
而且我知道我們不能從不同的視圖共享一個 var,所以我花了幾個小時在 Internet 上了解更多關于使用 @State/@Binding 或 @EnvironmentObject 但所有示例都是關于從父視圖共享一個 var 給孩子視圖但不在子視圖之間轉換為父視圖。
此外,無論我在做什么,Xcode 總是會出錯,因為某處缺少某些東西!
我需要你的幫助,在此先感謝!:P
uj5u.com熱心網友回復:
我花了幾個小時在 Internet 上了解有關使用 @State/@Binding 或 @EnvironmentObject 的更多資訊
因此,您走在正確的道路上,因為您確實需要使用@Binding. 也許您只是對如何連接這些點有錯誤的想法。
基本上,您需要@State父視圖中的屬性包裝器,或者ContentView因為您想在子視圖中共享相同的屬性并對它的任何突變做出反應,所以您@Binding在子視圖中使用屬性包裝器。
所以你會有這樣的事情:
struct ContentView: View {
@State var showHello = true
var body: some View {
VStack {
TopView(showHello: $showHello)
BottomView(showHello: showHello)
}
}
}
struct TopView: View {
@Binding var showHello: Bool
var body: some View {
Button("Show Hello", action: { showHello.toggle() })
.padding()
}
}
struct BottomView: View {
let showHello: Bool
var body: some View {
Text("This is your message:")
Text("Hello")
.opacity(showHello ? 1 : 0)
}
}
我會為 SwiftUI 推薦一些其他好的資源:
- SwiftUI 狀態管理
- @捆綁
- John Sundell 的 SwiftUI 文章
uj5u.com熱心網友回復:
您不需要@Binding在此特定示例中使用,因為您沒有更改showHello子視圖中的狀態。@Binding用于雙向資料流(即從父級到子級,反之亦然)。如果您的資料流是單向的(即從父級到子級),您可以let在子視圖中使用簡單的。
此外,而不是這個:
if showHello == true {
Text("Hello")
} else {
Text("Hello")
.opacity(0)
}
你應該做這個:
Text("Hello")
.opacity(showHello ? 1 : 0)
第一種方法創建了兩個不同且獨立View的 s,而第二種方法創建了一個單獨View的opacity修飾符,您可以根據需要更改其修飾符。像這樣簡單的層次結構沒什么大不了的View,但是一旦您開始獲得更復雜的層次結構,它將有助于 SwiftUI 的視圖差異和重新渲染。它對影片有幫助,因為它是一個View正在變化的屬性,而不是兩個View切換出來的屬性。
這樣也更容易閱讀。
uj5u.com熱心網友回復:
好的,一切運行良好。感謝你們所有人,尤其是@NicolasElPapu。
此外,該解決方案適用于模擬器,但不適用于 PreviewProviders。如果您仍然像我一樣遇到錯誤,只需更新底部的這些代碼。
struct TopView_Previews: PreviewProvider {
static var previews: some View {
TopView(showHello: .constant(true))
}
}
struct BottomView_Previews: PreviewProvider {
static var previews: some View {
BottomView(showHello: true) // Or .constant(true) again if you're not using a let for the BottomView!
}
}
此外,如果您想了解為什么需要在 PreviewProvider 中添加虛假資訊,原因如下:https ://www.hackingwithswift.com/forums/swiftui/binding-variable-won-t-preview/10974
再次感謝各位!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/448209.html
