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解决这些问题。如果我知道如何…您可以显示文本字段的代码及其所在的视图。是的。我已经把它添加到问题中了。太棒了!谢谢不客气!