SwiftUI: `Toggle`s в динамическом` List` нарушает макет при повторном использовании?

Я пытаюсь показать динамический List со строками, содержащими Toggle элементы. Toggle изначально размещены правильно, но их расположение нарушается при прокрутке их в и из поля зрения (т. Е. При повторном использовании ячеек).

Минимальный пример кода:

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")
        }
    }
}

Запись экрана, демонстрирующая проблему:  Переключатели в списке изначально имеют правильный макет, но нарушают макет при прокрутке

(Используется iOS 13.2.2 (17B102) на симуляторе.)

Я что-то делаю не так или это ошибка? Как добиться правильного отображения Toggles?


person sizzle beam    schedule 18.11.2019    source источник


Ответы (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) )

Отправьте отзыв в Apple

Временное решение

Эта ошибка влияет только на инициализаторы List, которые принимают параметр data. Этот код функционально эквивалентен, но на него не влияет ошибка.

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

Мне удалось воспроизвести проблему, но я не мог понять, почему это происходит. Когда я использую 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")
        }
    }
}

Надеюсь, это поможет!

person krjw    schedule 18.11.2019