我有一个带有 的视图@FocusState
,我想将其传递到子视图中。对于子视图,我使用@FocusState.Binding
。如果我不使用自定义初始化程序,这可以正常工作……但我无法弄清楚它如何与自定义视图初始化程序一起工作的语法,出于其他原因我需要它。
这是有效的代码:
struct TestListButtonsAndListFocusView: View {
@FocusState var buttonFocusState: ButtonState?
@ObservedObject var viewModel: ViewModel = ViewModel()
var body: some View {
TestListView(viewModel: viewModel, bindedFocusButtonState: $buttonFocusState) // for custom init, replace with following line
//TestListView(viewModel: viewModel, focusButtonState: $buttonFocusState) // 1. Uncomment this for custom initializer
}
}
struct TestListView: View {
@State private var items1: [TimedItem] = [
TimedItem(number: 1, timestamp: "2024-11-20 10:00"),
TimedItem(number: 2, timestamp: "2024-11-20 11:00"),
TimedItem(number: 3, timestamp: "2024-11-20 12:00")
]
@ObservedObject var viewModel: ViewModel
@FocusState.Binding var bindedFocusButtonState: ButtonState?
@State var selectedItem: TimedItem.ID?
var body: some View {
List(items1, selection: $selectedItem) { item in
ContentListItemView(item: item)
}
.onChange(of: bindedFocusButtonState) {
if let bindedFocusButtonState {
print("TestListView - bindedListFocusState has changed to \(bindedFocusButtonState)")
if bindedFocusButtonState == .one && selectedItem == nil {
selectedItem = items1.first?.id
}
} else {
print("ListOneView - bindedListFocusState has changed to nil")
}
}
}
// 2. Uncomment this
/*init(viewModel: ViewModel, focusButtonState: FocusState<ButtonState?>.Binding) {
// how to pass in @FocusState.Binding?
self.viewModel = viewModel
self.bindedFocusButtonState = focusButtonState
// Error: Cannot assign value of type 'FocusState<ButtonState?>.Binding' to type 'ButtonState?'
}*/
}
public class ViewModel: NSObject, ObservableObject {
@Published public var selectedButton: ButtonState? = ButtonState.one
}
public enum ButtonState: Int, CaseIterable, Hashable, Identifiable {
public var id: Self {
return self
}
case one, two, three
}
#Preview {
TestListButtonsAndListFocusView()
}
但是,如果我取消注释自定义初始化程序的行,然后取消注释TestListButtonsAndListFocusView
使用自定义初始化程序的行,则语法错误,并且会出现错误:
错误:无法将“FocusState<ButtonState?>.Binding”类型的值分配给“ButtonState?”类型
我不确定如何以@FocusState.Binding
这种方式初始化。我知道如果我使用var bindedFocusButtonState: FocusState<ContactTabStyle?>.Binding
,然后在初始化程序中使用它,它会起作用。但我真的很想弄清楚如何将 new@FocusState.Binding
与自定义初始化程序一起使用,因为它避免了必须访问wrappedValue
并且更容易观察onChange
您应该分配给以下划线为前缀的属性
_bindedFocusButtonState
。这是实际包含 的属性
FocusState.Binding
。bindedFocusButtonState
另一方面,实际上是返回 的计算属性_bindedFocusButtonState.wrappedValue
。尤其是这一行
声明三个属性: