SwiftUI-使视图中的文本字段成为触摸该视图的第一响应者
从某种角度看,我有这样的想法:SwiftUI-使视图中的文本字段成为触摸该视图的第一响应者,swiftui,Swiftui,从某种角度看,我有这样的想法: TextFieldUsername() struct CustomTextField1: UIViewRepresentable { class Coordinator: NSObject, UITextFieldDelegate { @Binding var text: String var didBecomeFirstResponder = false init(text: Binding<Str
TextFieldUsername()
struct CustomTextField1: UIViewRepresentable {
class Coordinator: NSObject, UITextFieldDelegate {
@Binding var text: String
var didBecomeFirstResponder = false
init(text: Binding<String>) {
_text = text
}
func textFieldDidChangeSelection(_ textField: UITextField) {
text = textField.text ?? ""
}
}
@Binding var text: String
var isFirstResponder: Bool = false
func makeUIView(context: UIViewRepresentableContext<CustomTextField1>) -> UITextField {
let textField = UITextField(frame: .zero)
textField.delegate = context.coordinator
return textField
}
func makeCoordinator() -> CustomTextField1.Coordinator {
return Coordinator(text: $text)
}
func updateUIView(_ uiView: UITextField, context: UIViewRepresentableContext<CustomTextField1>) {
uiView.text = text
if isFirstResponder && !context.coordinator.didBecomeFirstResponder {
uiView.becomeFirstResponder()
context.coordinator.didBecomeFirstResponder = true
}
}
}
struct ContentView : View {
@State var text: String = ""
@State var isEditing = false
var body: some View {
CustomTextField1(text: $text, isFirstResponder: isEditing)
.frame(width: 300, height: 50)
.background(Color.red)
.onTapGesture {
isEditing.toggle()
}
}
}
这表明
因此,此视图显示一个图标和textfield用户名
下面是另一个密码
使用户名字段成为焦点是不必要的困难。textfield并不小,但要使username字段成为焦点,只需点击准确的位置,可能需要点击2到3次才能实现
我想使整个TextFieldUsername()
t可点击或增加该文本字段的点击区域。我想更好地使整个东西可点击,一旦点击,使其文本字段处于焦点
这是TextFieldUsername
struct TextFieldUsername: View {
@State var username:String
var body: some View {
HStack {
Image(systemName: "person.crop.circle")
.renderingMode(.template)
.foregroundColor(.black)
.opacity(0.3)
.fixedSize()
TextField(TextFieldUsernameStrings.username, text: $username)
.textFieldStyle(PlainTextFieldStyle())
.textContentType(.username)
.autocapitalization(.none)
}
}
}
在SwiftUI中不使用任何外部库(如introspect)就可以做到这一点吗?使用自定义文本字段(如 您可以这样做:
TextFieldUsername()
struct CustomTextField1: UIViewRepresentable {
class Coordinator: NSObject, UITextFieldDelegate {
@Binding var text: String
var didBecomeFirstResponder = false
init(text: Binding<String>) {
_text = text
}
func textFieldDidChangeSelection(_ textField: UITextField) {
text = textField.text ?? ""
}
}
@Binding var text: String
var isFirstResponder: Bool = false
func makeUIView(context: UIViewRepresentableContext<CustomTextField1>) -> UITextField {
let textField = UITextField(frame: .zero)
textField.delegate = context.coordinator
return textField
}
func makeCoordinator() -> CustomTextField1.Coordinator {
return Coordinator(text: $text)
}
func updateUIView(_ uiView: UITextField, context: UIViewRepresentableContext<CustomTextField1>) {
uiView.text = text
if isFirstResponder && !context.coordinator.didBecomeFirstResponder {
uiView.becomeFirstResponder()
context.coordinator.didBecomeFirstResponder = true
}
}
}
struct ContentView : View {
@State var text: String = ""
@State var isEditing = false
var body: some View {
CustomTextField1(text: $text, isFirstResponder: isEditing)
.frame(width: 300, height: 50)
.background(Color.red)
.onTapGesture {
isEditing.toggle()
}
}
}
struct CustomTextField1:UIViewRepresentable{
类协调器:NSObject,UITextFieldDelegate{
@绑定变量文本:字符串
var didBecomeFirstResponder=false
init(文本:绑定){
_文本=文本
}
func textField didchangeSelection(textField:UITextField){
text=textField.text??“”
}
}
@绑定变量文本:字符串
var isFirstResponder:Bool=false
func makeUIView(上下文:UIViewRepresentableContext)->UITextField{
设textField=UITextField(帧:.0)
textField.delegate=context.coordinator
返回文本字段
}
func makeCoordinator()->CustomTextField1.Coordinator{
退货协调员(文本:$text)
}
func updateUIView(uiView:UITextField,context:UIViewRepresentableContext){
uiView.text=文本
如果是第一响应者&&!context.coordinator.didBecomeFirstResponder{
uiView.becomeFirstResponder()
context.coordinator.didBecomeFirstResponder=true
}
}
}
结构ContentView:View{
@状态变量文本:String=“”
@状态变量isEditing=false
var body:一些观点{
CustomTextField1(text:$text,isFirstResponder:IsEdit)
.框架(宽:300,高:50)
.背景(颜色.红色)
.ontapsigne{
isEditing.toggle()
}
}
}
这有点复杂,但应该完成工作。至于纯快捷界面的答案,目前还没有。请使用UIKit representable解决这些问题。如果我知道如何…您可以显示文本字段的代码及其所在的视图。是的。我已经把它添加到问题中了。太棒了!谢谢不客气!