我可能不了解基礎知識并且感到困惑,但我無法弄清楚以下事情的原因。好的,我想要做的是將 Int64 傳遞給子視圖并顯示基于位的切換并將位設定回父視圖,如下所示:
struct ContentView: View {
@State var bits: Int64 = 5
var body: some View {
Form {
Section {
SectionView(title: "Section", withBits: $bits)
} header: {
Text("Toggle")
}
}
}
}
struct SectionView: View {
let title: String
@Binding var bits: Int64
@State private var first: Bool
@State private var second: Bool
@State private var third: Bool
init(title: String, withBits: Binding<Int64>) {
self.title = title
self._bits = withBits
self.first = self.bits & 1 == 1
self.second = self.bits & 2 == 2
self.third = self.bits & 4 == 4
}
var body: some View {
VStack {
HStack {
Text(self.title)
}
HStack {
Toggle("Toggle 1", isOn: self.$first)
.onChange(of: self.first) { newValue in
if newValue {
self.bits |= 1
}
else {
self.bits &= ~1
}
}
}
HStack {
Toggle("Toggle 2", isOn: self.$second)
.onChange(of: self.second) { newValue in
if newValue {
self.bits |= 2
}
else {
self.bits &= ~2
}
}
}
HStack {
Toggle("Toggle 3", isOn: self.$third)
.onChange(of: self.third) { newValue in
if newValue {
self.bits |= 4
}
else {
self.bits &= ~4
}
}
}
}
.onChange(of: self.bits) { newValue in
print("bits: \(bits)")
}
}
}
但它不會編譯。說“在所有存盤屬性初始化之前使用'self'”錯誤。
因此,我將默認值設定為所有 Bool 變數,如下所示:
@State private var first: Bool = false
@State private var second: Bool = false
@State private var third: Bool = false
它現在編譯但不能在 int() 中覆寫它們,下面的行被完全忽略。
self.first = self.bits & 1 == 1
self.second = self.bits & 2 == 2
self.third = self.bits & 4 == 4
將三行以上移至 onAppear() 有效。但我仍然想知道為什么它們不會被 init() 和最干凈的方式覆寫。
uj5u.com熱心網友回復:
如果可以,請避免在初始化程式中使用正在初始化的變數。一Binding開始沒有任何價值,這就是為什么你需要等待你的視圖出現。
嘗試用以下代碼替換 3 個變數的初始化(使用init()和不使用.onAppear()):
self.first = withBits.wrappedValue & 1 == 1 // Why using an always true condition? OK if this is just a placeholder
self.second = withBits.wrappedValue & 2 == 2
self.third = withBits.wrappedValue & 4 == 4
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/429688.html
標籤:迅速
