SwiftUI 中带有文本字段的长列表

Posted

技术标签:

【中文标题】SwiftUI 中带有文本字段的长列表【英文标题】:Long List with Textfields in SwiftUI 【发布时间】:2019-11-19 11:34:29 【问题描述】:

我尝试使用 SwiftUI 做一个列表,您可以在其中插入两个字符串在文本字段中,并在每一行中插入一个布尔按钮。但是,当列表超出屏幕并且您滚动到最后一行时,它们有时会删除内容。 我创建了一个最小的例子:

struct ContentView: View 
    @State var bindOne = "one"
    @State var bindTwo = "two"
    @State var bindThree = "three"
    @State var bindFour = "four"
    @State var bindFive = "five"
    @State var bindSix = "six"
    @State var buttonValue = false


    var body: some View 
        VStack
            Text("test")
                .font(.largeTitle)

        List
            Row(someBind: bindOne, buttonValue: false)
            Row(someBind: bindTwo, buttonValue: false)
            Row(someBind: bindThree, buttonValue: false)
            Row(someBind: bindFour, buttonValue: false)
            Row(someBind: bindFive, buttonValue: false)
            Row(someBind: bindSix, buttonValue: false)

            
        
        
    

与支持视图:

struct Row: View 
    @State var someBind: String
    @State var buttonValue: Bool

    var body: some View 
        HStack
            TextField(someBind, text: $someBind)
            .font(.largeTitle)
            TextField(someBind, text: $someBind)
                .font(.largeTitle)
            Button(action: self.buttonValue.toggle())
                if buttonValue
                    Text("Yes")
                        .font(.largeTitle)
                else
                    Text("No")
                    .font(.largeTitle)
                
            
        
        .padding(.vertical, 70)

    

结果是

当线条适合屏幕时没有问题,但有时你只是有一个很长的列表。 这是一个错误还是我错过了什么?

【问题讨论】:

您使用哪个 Xcode 版本?您可能会遇到与here 所述相同的问题 我使用的是 11.2.1 (11B500)。是的,可以连接。 它在 11.1 上为我工作 在 13.2 上确认问题,在 13.0 上工作 在 11.2+ 中,List 滚动后的行布局似乎存在很多问题。参见this answer 和file feedback 【参考方案1】:

问题不再存在。使用 Xcode Version 11.4.1 (11E503a) 检查。

【讨论】:

以上是关于SwiftUI 中带有文本字段的长列表的主要内容,如果未能解决你的问题,请参考以下文章

如何有效地过滤 SwiftUI 中的长列表?

SwiftUI 列表中的可编辑文本字段

内容类型选择列表中带有标题的查看列表

根据数组中的重复模式更改 SwiftUI 列表中文本字段的第二次出现

如果列表行在 SwiftUI 中包含文本字段,则无法从 foreach 中删除元素

Flutter BLoC 库中带有验证的文本字段