SwiftUI列表中某些行的布局问题

5
我尝试过查找以前提出的类似问题,但未能成功。
我有一个简单的视图和列表。 我使用ForEach显示10个迭代的某些列表项,以创建布局,然后再将真实数据添加到此列表中。 我遇到了最后2行无法正确渲染的问题。 但有时是其他行。 我也在iPhone上进行了测试,有时是一行,有时是另一行。 列表视图的代码如下:
import SwiftUI

struct LocksView: View {

    @State private var locksPaid = 0

    var body: some View {
        NavigationView {
            List {
                DateView()
                    .listRowInsets(EdgeInsets())

                Picker(selection: $locksPaid, label: Text("Picker")) {
                    Text("All").tag(0)
                    Text("Not paid (2)").tag(1)
                }
                .pickerStyle(SegmentedPickerStyle())
                .padding(10)

                ForEach(0 ..< 10) {item in
                    LocksItemView()
                }

            }
            .navigationBarTitle(Text("Locks"))
            .navigationBarItems(trailing: EditButton())
        }
    }
}

列表项的代码如下:
import SwiftUI

struct LocksItemView: View {

    @State private var paid : Bool = false

    var body: some View {
        HStack {

            Text("L15")
                .font(.title)
                .fontWeight(.heavy)
                .multilineTextAlignment(.center)
                .frame(width: 80)

            VStack(alignment: .leading) {
                Text("nickname")
                    .fontWeight(.bold)
                Text("category")
                Text("4 000 THB")
                    .fontWeight(.bold)
            }

            Spacer()

            Toggle(isOn: self.$paid) {
                Text("Paid")
            }
            .labelsHidden()
        }
    }
}

为什么我的列表中有些行的切换按钮失效了?它为什么会移动到左侧?

enter image description here


看起来在iOS 13.4和Xcode 11.4中已经修复了 :) - mallow
2个回答

2
这不是最后一项。如果您将您的ForEach中的10更改为20,并上下滚动,您会看到更有趣的问题。
我认为,实际上是由于List的错误原因与这个主题相同。 解决方法:如果对您来说不是很重要,请使用ScrollView代替List,因为经过测试,没有此bug。否则,请提交Radar并等待修复。

谢谢@Asperi。我正在使用List,因为ScrollView会引起其他问题。我想我会继续使用List一段时间并尝试解决这个问题。如果不行,就需要解决ScrollView的其他问题 :) - mallow
顺便说一句,感谢你指出并非总是最后两行的问题。我在手机上再次测试,有时是一行,有时是另一行。我已经更新了我的问题。 - mallow
Asperi,你的解决方法很好用。我刚刚尝试了一下,谢谢你!但正如我所说,我在 ScrollView 上遇到了一些问题。而且就像 @Александр 发现的那样,这可能是一个 bug,希望它会在下一个 iOS 更新中得到解决。如果不行,我将尝试使用你的解决方案,并修复滚动视图的问题。 - mallow

1
我先在模拟器上尝试了你的代码,也遇到了同样的问题。但是后来我想起来,iOS 13.2 存在一些问题,于是我在我的设备(iPhone 7,iOS 13.1.1)上运行它,一切正常!我认为问题出在 iOS 13.2 上,而不是 List 组件上。这里有一个示例,我改变了代码以证明一切都正常:
import SwiftUI

struct LocksView: View {
    
    @State private var locksPaid = 0

    var body: some View {
        NavigationView {
            List {
                Picker(selection: $locksPaid, label: Text("Picker")) {
                    Text("All").tag(0)
                    Text("Not paid (2)").tag(1)
                }
                .pickerStyle(SegmentedPickerStyle())
                .padding(10)

                ForEach(0 ..< 200) {item in
                    LocksItemView(number: item)
                }

            }
            .navigationBarTitle(Text("Locks"))
            .navigationBarItems(trailing: EditButton())
        }
    }
}

struct LocksItemView: View {

    @State private var paid : Bool = false
    var number: Int

    var body: some View {
        HStack {

            Text("L\(self.number)")
                .font(.title)
                .fontWeight(.heavy)
                .multilineTextAlignment(.center)
                .frame(width: 80)

            VStack(alignment: .leading) {
                Text("nickname")
                    .fontWeight(.bold)
                Text("category")
                Text("4 000 THB")
                    .fontWeight(.bold)
            }

            Spacer()

            Toggle(isOn: self.$paid) {
                Text("Paid")
            }
            .labelsHidden()
        }
    }
}

在我的手机上,结果是:

和在我的手机上,结果是:

enter image description here

所以13.2版本存在漏洞,我希望苹果能够修复所有问题。


哇!非常感谢你的观察。我该如何在SwiftUI中提交一个错误报告?我会尝试一段时间来解决这个问题。也许为行添加ID会有所帮助?也许现在行没有被完全视为独立的行?只是一个猜测。但你的发现表明,即使这段确切的代码在先前的iOS上运行良好。谢谢! - mallow
@mallow,我认为https://feedbackassistant.apple.com是报告此错误的正确位置,也许今天晚些时候我也会这样做。 - Hrabovskyi Oleksandr
谢谢!我会去做的。我曾经在那里报告过一些关于macOS或iOS的错误,但它们从来没有被修复过,我的提交很少有回应。所以我希望有更好的方法 :) - mallow
@mallow,评论已发送给苹果,但我认为你也可以这样做,不会有任何影响 =) - Hrabovskyi Oleksandr
非常感谢您的付出,Александр。我已经自己提交了这个错误。我还在我的Xcode中安装了新的模拟器,并使用iOS 13.1,与您告诉我的一样 - 一切看起来都很完美。我希望苹果公司能在下一个iOS更新中修复这个错误。 - mallow
1
这个 bug 在 13.3 版本中仍然存在。:/ - Stefan Vasiljevic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接