89929


Xcode13.4.1, Swift5.6.1を使用して簡単な計算アプリを開発しています。  
decimalPadにはマイナスの入力がないので、キーボード上部にツールバーを追加し、入力するような動作ができればと考えています。  
複数Viewでこのツールバーを追加をしたいため、Modifierを自作して各ViewにTextFieldを配置、修飾しています。

[code]

    // キーボード上部を修飾するために置くtextFieldのModifier
    struct AddKeyboardAccesaryTextFieldModifier: ViewModifier {
        func body(content: Content) -> some View {
            content
                .padding()
                .toolbar {
                    ToolbarItemGroup(placement: .keyboard) {
                        HStack{
                            // ツールバーの中身
                            Button("-") {
                                // ここに選択中のTextFieldへ"-"を挿入するコードを書きたい
                            }
                        }
                    }
                }
        }
    }
    
[/code]

上記コード内の  
`// ここに選択中のTextFieldへ"-"を挿入するコードを書きたい`  
の部分、選択中のテキストフィールドへ文字を挿入する方法が分からず、途方に暮れています。  
どうかご助力頂けますと幸いです。よろしくお願いいたします。


CC BY-SA 4.0
2022-07-09T07:36:56.077
89855
2022-07-12T09:22:31.340
2022-07-11T08:34:40.483
53452
53452
question
swift swiftui swift5
キーボード上部の自作ツールバーを使用して文字を挿入したい


こんな感じでどうでしょうか？

[code]

    Button (action: minus) {
        Text("-")
    }
    
    中略
    
    func minus() {
        let value = テキストフィールドのインスタンス.stringValue
        if value.hasPrefix("-") {
            テキストフィールドのインスタンス.stringValue = value.removeFirst
        } else {
            テキストフィールドのインスタンス.stringValue = "-" + value
        }
    }
    
[/code]


CC BY-SA 4.0
2022-07-09T09:54:37.043
89859
2022-07-11T09:05:46.170
2022-07-11T09:05:46.170
14745
14745
89855
answer


Focus系を使用すればうまくいくようです。

[code]

    enum Field {
      case first
      case second
    }
    
    extension FocusedValues {
      private struct SelectedFieldKey: FocusedValueKey {
        typealias Value = Field?
      }
      var field: Field? {
        get { self[SelectedFieldKey.self]?.unsafelyUnwrapped } // unsafelyUnwrappedで合っているか不明
        set { self[SelectedFieldKey.self] = newValue }
      }
    }
    
    struct ContentView: View {
      @State var text1 = ""
      @State var text2 = ""
      @FocusedValue(\.field) var field
    
      var body: some View {
        NavigationStack {
          VStack {
            TextField("text1", text: $text1)
              .focusedValue(\.field, .first)
            TextField("text2", text: $text2)
              .focusedValue(\.field, .second)
          }
        }
        .modifier(AddKeyboardAccessaryTextFieldModifier(text1: $text1, text2: $text2))
      }
    }
    
    struct AddKeyboardAccessaryTextFieldModifier: ViewModifier {
      @FocusedValue(\.field) var field
    
      @Binding var text1: String
      @Binding var text2: String
    
      func addText(_ text: String) {
        guard let field = field else { return }
    
        switch field {
          case .first:
            text1 += text
          case .second:
            text2 += text
        }
      }
    
      func body(content: Content) -> some View {
        content
          .toolbar {
            ToolbarItemGroup(placement: .keyboard) {
              Button("-") {
                addText("-")
              }
            }
          }
      }
    }
    
[/code]


CC BY-SA 4.0
2022-07-12T09:00:32.597
89929
2022-07-12T09:22:31.340
2022-07-12T09:22:31.340
40856
40856
89855
answer