我有以下SwiftUIView
(缩短):
struct ItemTextField: View {
@Binding var textFieldText: String
@Binding var currentMode: DisplayMode
var body: some View {
PresetTextField(defaultText: "Enter item name",
presetText: dataSource.nameOfEditedViewItem == nil ? textFieldText : dataSource.nameOfEditedViewItem!,
textFieldText: $textFieldText)
.onChange(of: textFieldText) { newtext in
textFieldText = newtext
// …
currentMode = textFieldText.isEmpty ? .addingItems : .enteringItemName
}
}
}
这个ItemTextField
在View
中使用如下:
@State private var currentMode: DisplayMode = .displayingItems
@State private var textFieldText = ""
// …
ItemTextField(textFieldText: $textFieldText,
currentMode: $currentMode)
当到达指令currentMode =
的断点时,调试器显示以下值:
Printing description of self._currentMode:
▿ Binding<DisplayMode>
▿ transaction : Transaction
▿ plist : []
- elements : nil
- location : 0xe000000000000000 <x-coredata:////p4293263453814>
- _value : ShopEasy_.DisplayMode.displayingItems
和
(lldb) po currentMode
ShopEasy_.DisplayMode.addingItems
在单个步骤之后,即执行指令currentMode =
之后,调试器显示以下值:
Printing description of self._currentMode:
▿ Binding<DisplayMode>
▿ transaction : Transaction
▿ plist : []
- elements : nil
- location : 0xe000000000000000 <x-coredata:////p4293263453814>
- _value : ShopEasy_.DisplayMode.displayingItems
和
(lldb) po currentMode
ShopEasy_.DisplayMode.enteringItemName
显然,self._currentMode
和currentMode
是不同的项目,但为什么?我认为@Binding
会将本地项绑定到传递的项。
怎么做才对呢?
现在我认为这是lldb中的一个bug。根据@user1046037的建议,我编写了以下最小项目:
import SwiftUI
struct ContentView: View {
@State var state = false
var body: some View {
ButtonView(state: $state)
}
}
struct ButtonView: View {
@Binding var state: Bool
var body: some View {
Button("State: (state ? "true" : "false")") {
state = true
}
}
}
此代码按预期工作,即state
在Button操作中更改。
然后我在state = true
设置了一个断点。下面是调试器的输出在执行赋值
Printing description of self._state:
▿ Binding<Bool>
▿ transaction : Transaction
▿ plist : []
- elements : nil
▿ location : <LocationBox<ScopedLocation>: 0x6000016895c0>
- _value : false
(lldb) po state
false
和赋值
之后Printing description of self._state:
▿ Binding<Bool>
▿ transaction : Transaction
▿ plist : []
- elements : nil
▿ location : <LocationBox<ScopedLocation>: 0x6000016895c0>
- _value : false
(lldb) po state
true
这表明lldb的输出是错误的,而代码是正确的。