SWIFTUI 2, SWIFTUI 3 - MACOS: Why TextField's onCommit closure is always trigger every time I switch to another tab

  • My code: I use onCommit closure to be able to perform an action by pressing the Enter key when the TextField is being focused.
import SwiftUI

struct ContentView: View {
  @State private var text = ""

  var body: some View {
    TabView {
      TextField(
        "",
        text: $text,
        onCommit: { print("onCommit") } // I have a problem here
      )
        .tabItem {
          Text("Tab 1")
        }

      Text("Tab 2")
        .tabItem {
          Text("Tab 2")
        }

      Text("Tab 3")
        .tabItem {
          Text("Tab 3")
        }
    }
  }
}
  • My problem: The onCommit closure is also always triggered when I switch to another tab, making my App perform an unexpected action.
  • My questions:
    1. This is the bug or the feature?
    2. Is there any other way to perform an action by pressing Enter key?
Answered by Duong_Thai in 679553022

Deprecated

Use init(_:text:prompt:) instead. Add the onSubmit(of:_:) view modifier for the onCommit behavior, and onFocus(_:) for the onEditingChanged behavior.

import SwiftUI

struct ContentView: View {
  @State private var text = ""

  var body: some View {
    TabView {
      TextField("", text: $text)
        .onSubmit {               // new api
          print("onCommit")
        }
        .tabItem {
          Text("Tab 1")
        }

      Text("Tab 2")
        .tabItem {
          Text("Tab 2")
        }

      Text("Tab 3")
        .tabItem {
          Text("Tab 3")
        }
    }
  }
}
  • onSubmit doesn't trigger every time I switch to another tab.

Accepted Answer

Deprecated

Use init(_:text:prompt:) instead. Add the onSubmit(of:_:) view modifier for the onCommit behavior, and onFocus(_:) for the onEditingChanged behavior.

import SwiftUI

struct ContentView: View {
  @State private var text = ""

  var body: some View {
    TabView {
      TextField("", text: $text)
        .onSubmit {               // new api
          print("onCommit")
        }
        .tabItem {
          Text("Tab 1")
        }

      Text("Tab 2")
        .tabItem {
          Text("Tab 2")
        }

      Text("Tab 3")
        .tabItem {
          Text("Tab 3")
        }
    }
  }
}
  • onSubmit doesn't trigger every time I switch to another tab.

SWIFTUI 2, SWIFTUI 3 - MACOS: Why TextField's onCommit closure is always trigger every time I switch to another tab
 
 
Q