在文本字段内单击时如何选择所有文本?就像在 Chrome 等网络浏览器中单击地址栏时的情况一样。
import SwiftUI
import AppKit
struct ContentView: View {
var body: some View {
TextField("Enter a URL", text: $site)
}
}
Run Code Online (Sandbox Code Playgroud)
Raj*_*han 27
SwiftUI 解决方案:
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)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
注意:导入组合
使用委托UIViewRepresentable
包装UITextField
和使用属性。textField.selectedTextRange
这是示例演示
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)
}
}
}
Run Code Online (Sandbox Code Playgroud)
对于 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)
}
}
}
Run Code Online (Sandbox Code Playgroud)
我创建了一个ViewModifier
来选择 a 中的所有文本TextField
。唯一的缺点是,它不能与多个TextFields
.
public struct SelectTextOnEditingModifier: ViewModifier {
public func body(content: Content) -> some View {
content
.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)
}
}
}
}
extension View {
/// Select all the text in a TextField when starting to edit.
/// This will not work with multiple TextField's in a single view due to not able to match the selected TextField with underlying UITextField
public func selectAllTextOnEditing() -> some View {
modifier(SelectTextOnEditingModifier())
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
TextField("Placeholder", text: .constant("This is text data"))
.selectAllTextOnEditing()
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
8582 次 |
最近记录: |