Add Find and Replace to a TextEditor in SwiftUI
Written by Team Kodeco
When dealing with larger blocks of text in SwiftUI’s TextEditor
, it can be useful to provide a user interface for find and replace operations. This feature allows users to search for specific strings of text and optionally replace them with others. In SwiftUI, this functionality is easily achievable with the findNavigator
modifier.
Consider this example:
struct ContentView: View {
@State private var text = "This is some editable text."
@State private var isPresented = false
var body: some View {
NavigationStack {
TextEditor(text: $text)
.findNavigator(isPresented: $isPresented)
.navigationTitle("Text Editor")
.toolbar {
Toggle(isOn: $isPresented) {
Label("Find", systemImage: "magnifyingglass")
}
}
}
}
}
Tap the magnifying glass and search for “edit”. Your preview should look like this:
In this example, you create a TextEditor
view, bind it to a @State
variable text
and attach a toolbar
with a toggle button. The findNavigator
modifier presents the search interface when isPresented
is true
and hides it when false
. Tapping the magnifying glass in the toolbar toggles the visibility of the search interface.
Additionally, if you need to disable the find and replace operations in a TextEditor
, you can use the .findDisabled(_:)
and .replaceDisabled(_:)
modifiers, respectively. Here’s how you can use these modifiers:
struct ContentView: View {
@State private var text = "This is some editable text."
@State private var isDisabled = true
@State private var isPresented = false
var body: some View {
NavigationStack {
TextEditor(text: $text)
.findDisabled(isDisabled)
.replaceDisabled(isDisabled)
.findNavigator(isPresented: $isPresented)
.navigationTitle("Text Editor")
.toolbar {
Toggle(isOn: $isPresented) {
Label("Find", systemImage: "magnifyingglass")
}
}
}
}
}
Now tap the magnifying glass and your preview should look like:
Notice how the find and replace interface is disabled.
In this code snippet, you disable the find and replace operations in the TextEditor
by setting isDisabled
to true
. The find and replace interface will not show up, even if isPresented
is set to true
, because the disabling modifiers findDisabled
and replaceDisabled
appear closer to the TextEditor
.