swiftswiftui

Select all text in TextField upon click SwiftUI


How do i select all text when clicking inside the textfield? Just like how a web browser like chrome would when you click inside the address bar.

import SwiftUI
import AppKit

   struct ContentView: View {

    var body: some View {
        TextField("Enter a URL", text: $site)
    
  }
}

Solution

  • SwiftUI Solution:

    struct ContentView: View {
        var body: some View {
            TextField("Placeholder", text: .constant("This is text data"))
                .onReceive(NotificationCenter.default.publisher(for: UITextField.textDidBeginEditingNotification)) { obj in
                    if let textField = obj.object as? UITextField {
                        textField.selectedTextRange = textField.textRange(from: textField.beginningOfDocument, to: textField.endOfDocument)
                    }
                }
        }
    }
    

    Note : import Combine


    Use UIViewRepresentable and wrap UITextField and use textField.selectedTextRange property with delegate.

    Here is the sample demo

    struct HighlightTextField: UIViewRepresentable {
        
        @Binding var text: String
        
        func makeUIView(context: Context) -> UITextField {
            let textField = UITextField()
            textField.delegate = context.coordinator
            return textField
        }
        
        func updateUIView(_ textField: UITextField, context: Context) {
            textField.text = text
        }
        
        func makeCoordinator() -> Coordinator {
            Coordinator(parent: self)
        }
        
        class Coordinator: NSObject, UITextFieldDelegate {
            var parent: HighlightTextField
            
            init(parent: HighlightTextField) {
                self.parent = parent
            }
            
            func textFieldDidBeginEditing(_ textField: UITextField) {
                textField.selectedTextRange = textField.textRange(from: textField.beginningOfDocument, to: textField.endOfDocument)
            }
        }
    }
    
    


    For macOS

    struct HighlightTextField: NSViewRepresentable {
        
        @Binding var text: String
        
        func makeNSView(context: Context) -> CustomTextField {
            CustomTextField()
        }
        
        func updateNSView(_ textField: CustomTextField, context: Context) {
            textField.stringValue = text
        }
    }
    
    class CustomTextField: NSTextField {
        override func mouseDown(with event: NSEvent) {
            if let textEditor = currentEditor() {
                textEditor.selectAll(self)
            }
        }
    }