当键盘出现在SwiftUI中时,向上滚动查看文本字段
在我的用例中,我必须在当键盘出现在SwiftUI中时,向上滚动查看文本字段,swiftui,swiftui-list,Swiftui,Swiftui List,在我的用例中,我必须在列表中的可用项目下方放置文本字段,通过使用该文本字段,我们可以将项目添加到列表 最初,没有列表项(itemsarray为空) 这里有一个最小的,可重复的例子 import SwiftUI struct ContentView: View { @State var itemName = "" @State var items = [String]() var body: some View { NavigationView {
列表中的可用项目下方放置文本字段
,通过使用该文本字段
,我们可以将项目添加到列表
最初,没有列表项(items
array为空)
这里有一个最小的,可重复的例子
import SwiftUI
struct ContentView: View {
@State var itemName = ""
@State var items = [String]()
var body: some View {
NavigationView {
List {
ForEach(self.items, id: \.self) {
Text($0)
}
VStack {
TextField("Item Name", text: $itemName)
.textFieldStyle(RoundedBorderTextFieldStyle())
Button(action: {
self.items.append(self.itemName)
self.itemName = ""
}) {
Text("Add Item")
}
}
}
.navigationBarTitle(Text("Title"))
}
}
}
我们可以通过在TextField
中键入内容并单击“additem”按钮向列表中添加新项目,我们使用TextField
添加的每个项目都会显示在列表中的TextField上方。因此,TextField
会出现在列表中(就像苹果的提醒应用程序一样)
如果应用程序有很多项(超过7项),当键盘出现时,键盘会覆盖文本字段
,我们看不到文本字段
检查此屏幕截图:
我想知道的是如何在键盘出现时自动滚动列表(向上移动视图)以查看文本字段。我在最近的项目中遇到了类似的问题,对我来说,解决这个问题最简单的方法是在SwiftUI中包装UITextField,然后从我的自定义包装器到达父滚动视图,并告诉它在键盘出现时滚动。我在你的项目上尝试了我的方法,它似乎奏效了
如果您从此GitHub文件夹中获取包装器和其他文件的我的代码,然后将SwiftUI文本字段替换为我的自定义视图(TextFieldWithKeyboardObserver
),则它应该滚动
导入快捷界面
结构ContentView:View{
@状态变量itemName=“”
@状态变量项=[String]()
var body:一些观点{
导航视图{
名单{
ForEach(self.items,id:\.self){
文本(0美元)
}
VStack{
TextFieldWithKeyboardObserver(文本:$itemName,占位符:“itemName”)
按钮(操作:{
self.items.append(self.itemName)
self.itemName=“”
}) {
文本(“添加项”)
}
}
}
.navigationBarTitle(文本(“标题”))
}
}
}
我最近写了一篇文章解释了这个解决方案:你可以做的一件事(在这里回避你的问题)是将文本字段移到其他地方。这可能会解决这个问题,但显然并不能解决移动东西以尊重键盘的更大问题。这可能会对你有所帮助:也请看这里:我尝试了几种不同的方法,但最终对我有效的是非常感谢!回答得很好,文章也很棒。我认为SwiftUI需要一种更好的方法来处理这个问题,在此之前,在我看来,包装UIKitTextField是最好的方法——已经尝试了很多解决方案。再次感谢!这是迄今为止使用列表或滚动视图处理UITextField的最佳答案,我使用您的方法将UITextView向上移动,同时用户键入UITextView根据输入的文本高度扩展(不滚动)的位置!这篇博文也不错。我尝试使用这个解决方案,因为它工作得很好,但是使用自定义textfield会禁用所有其他可以调用常规textfield的swiftui方法,例如.keyboardType()
,multilineTextAlignment()
,这是最好的解决方案,应该标记为接受答案