当键盘出现在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()
,这是最好的解决方案,应该标记为接受答案