SwiftUI и ScrollView: представления исчезают после поворота устройства - PullRequest
1 голос
/ 02 марта 2020

Представление составлено с помощью SwiftUI, а список содержит несколько строк, где каждая строка содержит ScrollView с элементами. Это похоже на учебник Apple SwiftUI Landmark (https://developer.apple.com/tutorials/swiftui/composing-complex-interfaces). Когда я поворачиваю устройство (проверено на реальном iPhone XS), содержимое ScrollView исчезает. Проблема не возникает, когда я заменяю ScrollView другим элементом, таким как Text. Таким образом, проблема должна как-то быть связана с использованием ScrollView. Пожалуйста, смотрите ниже скриншоты и код SwiftUI.

Поведение

enter image description here

Код

struct ContentView: View {
    @FetchRequest(
        entity: InsigniaContainer.entity(),
        sortDescriptors: [
            NSSortDescriptor(keyPath: \InsigniaContainer.sort, ascending: true),
        ],
        predicate: NSPredicate(format: "parentContainer == NULL")
    ) var insigniaContainers: FetchedResults<InsigniaContainer>

    var body: some View {
        NavigationView {
            List {
                ForEach(self.insigniaContainers, id: \.objectID) { (insigniaContainer: InsigniaContainer) in
                    ServiceBranchRow(serviceBranch: insigniaContainer)
                }
                .listRowInsets(EdgeInsets())
            }
            .navigationBarTitle("Armed Forces")
        }
        .navigationViewStyle(StackNavigationViewStyle())
    }
}



struct ServiceBranchRow: View {
    var serviceBranch: InsigniaContainer

    var body: some View {
        VStack(alignment: .leading, spacing: 0) {
            Text(self.serviceBranch.wrappedName)
                .font(.headline)
                .fontWeight(.heavy)
                .padding(.leading, 15)
                .padding(.top, 10)
            Spacer()
            ScrollView(.horizontal, showsIndicators: false) {
                HStack(spacing: 15) {
                    ForEach(self.serviceBranch.sortedChildContainers, id: \.objectID) { item in
                        NavigationLink(destination: InsigniaList(insigniaContainer: item)) {
                            ServiceBranchItem(item: item)
                        }
                    }
                }
                .padding(10)
                .padding(.leading, 5)
                .padding(.trailing, 5)
                .padding(.bottom, 5)
            }
        }
    }
}

1 Ответ

1 голос
/ 03 марта 2020

Ох ... эта проблема ... известный эффект - это связано с кэшированием списка ... он думает, что все представления прокрутки одинаковы.

Исправление простое - просто добавьте уникальный идентификатор точно для прокрутки, как показано ниже

ScrollView(.horizontal, showsIndicators: false) {
    HStack(spacing: 15) {
        ForEach(self.serviceBranch.sortedChildContainers, id: \.objectID) { item in
            NavigationLink(destination: InsigniaList(insigniaContainer: item)) {
                ServiceBranchItem(item: item)
            }
        }
    }
    .padding(10)
    .padding(.leading, 5)
    .padding(.trailing, 5)
    .padding(.bottom, 5)
}
.id(UUID().uuidString) // !! here
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...