1

TextFieldSwiftUI の一部のみにキーボード ツールバーを追加しようとしています。

次のように定義されたビューがあります。

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()
        }
    }
}
4

0 に答える 0