我正在使用一个modal向列表中添加名称。当modal显示时,我希望自动聚焦TextField,如下所示:
我还没有找到合适的解决办法。
SwiftUI中是否已经实现了任何功能来实现这一点?
谢谢你的帮助。
var modal: some View {
NavigationView{
VStack{
HStack{
Spacer()
TextField("Name", text: $inputText) // autofocus this!
.textFieldStyle(DefaultTextFieldStyle())
.padding()
.font(.system(size: 25))
// something like .focus() ??
Spacer()
}
Button(action: {
if self.inputText != ""{
self.players.append(Player(name: self.inputText))
self.inputText = ""
self.isModal = false
}
}, label: {
HStack{
Text("Add \(inputText)")
Image(systemName: "plus")
}
.font(.system(size: 20))
})
.padding()
.foregroundColor(.white)
.background(Color.blue)
.cornerRadius(10)
Spacer()
}
.navigationBarTitle("New Player")
.navigationBarItems(trailing: Button(action: {self.isModal=false}, label: {Text("Cancel").font(.system(size: 20))}))
.padding()
}
}
5条答案
按热度按时间gzjq41n41#
iOS 15操作系统
有一个名为
@FocusState
的新 Package 器,它控制键盘和焦点键盘(“aka”firstResponder)的状态。注意️如果你想让它在初始时刻聚焦,你必须应用一个延迟。这是SwiftUI的一个已知bug。
成为第一响应者(专注)
如果对文本字段使用
focused
修饰符,则可以使它们成为焦点,例如,可以在代码中设置focusedField
属性以使绑定的textField成为活动的:放弃第一响应者(解散键盘)
或者通过将变量设置为
nil
来关闭键盘:不要忘记观看WWDC 2021SwiftUI中的直接和反映焦点会议
iOS 13和14(以及15)
老旧但仍在使用:
简单的 Package 器结构-像本机一样工作:
注意根据注解中的要求添加了文本绑定支持
用法:
额外🎁好处:完全可定制
nsc4cvqm2#
由于响应器链不是通过SwiftUI来使用的,所以我们必须使用UIViewRepresentable来使用它。我已经制定了一个变通方案,它的工作方式与我们使用UIKit的方式类似。
您可以像这样使用此组件...
这里isResponder是将responder分配给当前文本域,nextResponder是在当前文本域放弃它时做出第一个响应。
xmjla07d3#
SwiftUIX解决方案
使用
SwiftUIX
非常简单,我很惊讶更多的人没有意识到这一点。1.通过Swift程序包管理器安装SwiftUIX。
1.在您的代码中,
import SwiftUIX
。1.现在,您可以使用
CocoaTextField
代替TextField
来使用函数.isFirstResponder(true)
。zlhcx6iw4#
我认为SwiftUIX有很多方便的东西,但这仍然是你控制范围之外的代码,谁知道当SwiftUI 3.0出来时,糖魔法会发生什么。请允许我介绍一下无聊的UIKit解决方案,它通过合理的检查和升级的定时
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5)
进行了轻微升级//内容视图.swift
sdnqo3pr5#
对于macOS 13,有一个不需要延迟的新修改器。目前,在iOS 16上不起作用。
Apple Documentation: defaultFocus()