TextField
SwiftUI の一部のみにキーボード ツールバーを追加しようとしています。
次のように定義されたビューがあります。
struct Test: View {
@State private var name: String = ""
@State private var address: String = ""
@State private var username: String = ""
@State private var password: String = ""
enum Field: Hashable {
case nameField
case addressField
case usernameField
case passwordField
}
@FocusState private var focusedField: Field?
var body: some View {
Form {
Section {
TextField("Name", text: $name)
.focused($focusedField, equals: .nameField)
.submitLabel(.next)
TextField("Address", text: $address)
.focused($focusedField, equals: .addressField)
.submitLabel(.next)
TextField("Username", text: $username)
.focused($focusedField, equals: .usernameField)
.submitLabel(.next)
SecureField("Password", text: $password)
.focused($focusedField, equals: .passwordField)
.submitLabel(.done)
}
}
.toolbar {
ToolbarItemGroup(placement: .keyboard) {
if focusedField == .addressField {
Button("Test", action: {})
}
Button("Done", action: {
print(focusedField)
})
}
}
}
}
問題は、間違ったフィールドを選択すると追加のツールバー ボタンが表示されることです。
私もこのように使って@FocusedValue
みました:
...
@FocusedValue(\.field) var field: Field?
...
TextField("Name", text: $name)
.focused($focusedField, equals: .nameField)
.submitLabel(.next)
.focusedValue(\.field, .nameField)
...
.focusedValue(\.field, .addressField)
...
.focusedValue(\.field, .usernameField)
...
.focusedValue(\.field, .passwordField)
...
.toolbar {
ToolbarItemGroup(placement: .keyboard) {
if field == .addressField {
Button("Test", action: {})
}
Button("Done", action: {
print(field)
})
}
}
しかし、これは同じ結果をもたらします。focused
状態が設定される前に、ツールバーが決定されているかのようです。これがバグの可能性があるかどうかはわかりませんが、これは間違っていますか?
上記の作業を行っても、テキスト フィールドの 1 つのツールバーのみが必要であるという全体的な問題は解決されませんが、このように設定しようとすると、ツールバーがまったく表示されません。
.toolbar {
ToolbarItemGroup(placement: .keyboard) {
if field == .addressField {
Button("Test", action: {})
} else {
EmptyView()
}
}
}