在SwiftUI视图中,键盘始终位于顶部
我尝试在SwiftUI中开发一个测验应用程序。 为此,我希望键盘始终处于激活状态 现在的问题是,当我在键盘上点击回车键时,它消失了,我不得不再次点击文本字段 如何修改文本字段,使其在单击后不会消失,或者在此视图中键盘始终处于激活状态 我使用以下版本: Xcode:Version12.4(12D4e)/iOS版本:14.4 所需视图中的一些示例代码:在SwiftUI视图中,键盘始终位于顶部,swiftui,keyboard,textfield,Swiftui,Keyboard,Textfield,我尝试在SwiftUI中开发一个测验应用程序。 为此,我希望键盘始终处于激活状态 现在的问题是,当我在键盘上点击回车键时,它消失了,我不得不再次点击文本字段 如何修改文本字段,使其在单击后不会消失,或者在此视图中键盘始终处于激活状态 我使用以下版本: Xcode:Version12.4(12D4e)/iOS版本:14.4 所需视图中的一些示例代码: struct Practice: View { @Binding var Alpha: Array<String> @
struct Practice: View {
@Binding var Alpha: Array<String>
@State private var inputdesc: String = "Answer"
@State private var placeholder: String = ""
@State var new = 0
var body: some View {
ZStack {
Color("Background").ignoresSafeArea()
VStack {
Text(Alpha[new])
.font(.system(size: 160))
TextField(inputdesc, text: $placeholder, onCommit: {
new = Int.random(in: 0..<Alpha.count)
placeholder = ""
})
}
.font(.system(size: 50))
.autocapitalization(.none)
.disableAutocorrection(true)
.multilineTextAlignment(.center)
.foregroundColor(Color("BackgroundInverse"))
}
}
}
结构实践:视图{
@绑定变量Alpha:Array
@国家私有变量inputdesc:String=“Answer”
@状态专用变量占位符:String=“”
@状态变量new=0
var body:一些观点{
ZStack{
颜色(“背景”).ignoresSafeArea()
VStack{
文本(Alpha[新])
.font(.system(大小:160))
文本字段(inputdesc,文本:$占位符,onCommit:{
new=Int.random(in:0..您需要使用UIKit委托 这是演示版本代码
struct NoneDismissTextField: ViewModifier {
@ObservedObject var coordinator: Coordinator
private var onCommit: ()->Void
init(onCommit: @escaping ()->Void) {
self.onCommit = onCommit
coordinator = Coordinator(onCommit: onCommit)
}
public struct TextFieldView: UIViewRepresentable {
var configure: (UITextField) -> Void
public func makeUIView(context: UIViewRepresentableContext<TextFieldView>) -> UIView {
let view = UIView(frame: .zero)
DispatchQueue.main.async {
if let textField = view.superview?.superview?.subviews[1].subviews[0] as? UITextField {
configure(textField)
}
}
return view
}
public func updateUIView(_ uiView: UIView,
context: UIViewRepresentableContext<TextFieldView>) {
}
}
func body(content: Content) -> some View {
return content
.background(TextFieldView(configure: { (textField) in
textField.delegate = self.coordinator
}))
}
class Coordinator: NSObject, ObservableObject, UITextFieldDelegate {
private var onCommit: () -> Void
init(onCommit: @escaping ()->Void) {
self.onCommit = onCommit
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
onCommit()
return false
}
}
}
struct nonesmisstTextField:ViewModifier{
@观察对象变量协调器:协调器
私有var onCommit:()->Void
初始化(onCommit:@escaping()->Void){
self.onCommit=onCommit
协调员=协调员(onCommit:onCommit)
}
公共结构TextFieldView:UIViewRepresentable{
变量配置:(UITextField)->Void
公共函数makeUIView(上下文:UIViewRepresentableContext)->UIView{
let view=ui视图(帧:.0)
DispatchQueue.main.async{
如果let textField=view.superview?.superview?.subviews[1]。子视图[0]为?UITextField{
配置(文本字段)
}
}
返回视图
}
公共函数更新视图(uiView:uiView,
上下文:UIViewRepresentableContext){
}
}
func正文(内容:内容)->某些视图{
返回内容
.background(textfieldfiew)(配置:{(textField)在
textField.delegate=self.coordinator
}))
}
类协调器:NSObject、ObservableObject、UITextFieldDelegate{
私有var onCommit:()->Void
初始化(onCommit:@escaping()->Void){
self.onCommit=onCommit
}
func textField应该返回(textField:UITextField)->Bool{
onCommit()
返回错误
}
}
}
用法
TextField(inputdesc,text:$placeholder)
.修饰符(非DismissTextField)(onCommit:{
new=Int.random(在:0..中)应用程序崩溃并出现以下错误:“由于未捕获的异常'NSRangeException'终止应用程序,原因:'***-[\uu NSArray0 objectAtIndex:::]:索引0超出空NSArray的界限'”您能提到您正在使用的代码版本和操作系统版本吗?Xcode:version 12.4(12D4e)/iOS版本:14.4它也会因以下代码而崩溃:`TextField(inputdesc,text:$placeholder).modifier(nonesmissttextfield(onCommit:{print(“Test”)}))`我在iOS 14.3中使用了XCode 12.3,效果很好。iOS 14.4中出现了一些变化。这里似乎出现了错误view.superview?.superview?.subview[1]。subview[0]
您可以用这个来检查“查找文本字段”,也可以使用这个库来查找文本字段。谢谢您的帮助@Raja,但我无法让它正常工作。
TextField(inputdesc, text: $placeholder)
.modifier(NoneDismissTextField(onCommit: {
new = Int.random(in: 0..<Alpha.count)
placeholder = ""
}))