Skip to content

Instantly share code, notes, and snippets.

@sk-chanch
Created September 15, 2023 05:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sk-chanch/ff31b8786f641ee50677eccc804ce15c to your computer and use it in GitHub Desktop.
Save sk-chanch/ff31b8786f641ee50677eccc804ce15c to your computer and use it in GitHub Desktop.
SwiftUI SecureTextField with onEditingChanged and onCommit
//
// CustomSecureTextField.swift
//
//
// Created by Chanchana Koedtho on 15/9/2566 BE.
//
import Foundation
import SwiftUI
import UIKit
struct CustomSecureTextField: UIViewRepresentable {
// 1
@State var placeholder: String = ""
@Binding var text: String
var onCommit:(()->())?
var onEditingChanged:((Bool)->())?
init(_ placeholder: String = "",
text: Binding<String>,
onEditingChanged:((Bool)->())? = nil,
onCommit:(()->())? = nil) {
self.placeholder = placeholder
self._text = text
self.onEditingChanged = onEditingChanged
self.onCommit = onCommit
}
// 2
func makeUIView(context: UIViewRepresentableContext<CustomSecureTextField>) -> UITextField {
let tf = UITextField(frame: .zero)
tf.isUserInteractionEnabled = true
tf.delegate = context.coordinator
tf.placeholder = placeholder
tf.addTarget(context.coordinator,
action: #selector(context.coordinator.editingDidEndOnExit(_:)),
for: .editingDidEndOnExit)
return tf
}
func makeCoordinator() -> CustomSecureTextField.Coordinator {
return Coordinator(text: $text,
onEditingChanged: onEditingChanged,
onCommit: onCommit)
}
// 3
func updateUIView(_ uiView: UITextField, context: Context) {
uiView.text = text
uiView.isSecureTextEntry = true
}
// 4
class Coordinator: NSObject, UITextFieldDelegate {
@Binding var text: String
var onEditingChanged:((Bool)->())?
var onCommit:(()->())?
init(text: Binding<String>,
onEditingChanged:((Bool)->())?,
onCommit:(()->())? = nil) {
_text = text
self.onEditingChanged = onEditingChanged
self.onCommit = onCommit
}
func textFieldDidChangeSelection(_ textField: UITextField) {
text = textField.text ?? ""
}
func textFieldDidBeginEditing(_ textField: UITextField) {
onEditingChanged?(true)
}
func textFieldDidEndEditing(_ textField: UITextField) {
onEditingChanged?(false)
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return false
}
@objc func editingDidEndOnExit(_ textField: UITextField) {
onCommit?()
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment