SwiftUI:动态`List`中的`Toggle`s在重用时会中断其布局吗?

时间:2019-11-18 14:37:10

标签: ios toggle swiftui swiftui-list

我正在尝试显示包含行List元素的动态ToggleToggle最初的布局正确,但是当它们滚动进出视图时(即,在单元重用时),其布局会中断。

最小示例代码:

import SwiftUI

struct SwitchList: View {
    var body: some View {
        List(0..<20) { _ in
            SwitchRow(value: Bool.random())
        }
    }
}

struct SwitchRow: View {
    @State var value: Bool

    var body: some View {
        Toggle(isOn: $value) {
            Text("A switch row")
        }
    }
}

显示问题的屏幕录像: Toggles in a list have the correct layout initially, but break their layout upon scrolling

(这是在模拟器上使用iOS 13.2.2(17B102)。)

我是在做错什么,还是一个错误?如何使Toggle正确显示?

2 个答案:

答案 0 :(得分:2)

这是iOS 13.2+中的错误/回归

工作-iOS 13.1(17A844)/ Xcode 11.1(11A1027)
损坏-iOS 13.2.2(17B102)/ Xcode 11.2.1(11B500)
损坏-iOS 13.3 beta(17C5032d)/ Xcode 11.3 beta(11C24b)

Submit feedback to Apple

解决方法

此错误似乎只影响使用List参数的data初始化程序。这段代码在功能上是等效的,但不受该错误的影响。

struct SwitchList: View {
    var body: some View {
        List {
            ForEach(0..<20) { _ in
                SwitchRow(value: Bool.random())
            }
        }
    }
}

答案 1 :(得分:1)

我能够重现该问题,但找不到原因。当我将ScrollView()Devider()一起使用时,我不再遇到问题了。这是代码:

struct SwitchList: View {
    var body: some View {
        ScrollView {
            ForEach(1...50, id: \.self) { item in
                VStack {
                    SwitchRow(value: Bool.random())
                    Divider()
                }
            }
        }
    }
}

struct SwitchRow: View {
    @State var value: Bool

    var body: some View {
        Toggle(isOn: $value) {
            Text("A switch row")
        }
    }
}

我希望这会有所帮助!