意外的SwiftUI @Binding行为



我有以下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
}
}
}  

这个ItemTextFieldView中使用如下:

@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._currentModecurrentMode是不同的项目,但为什么?我认为@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的输出是错误的,而代码是正确的。

相关内容

  • 没有找到相关文章

最新更新