Экран учебного пособия по приложениям SwiftUI перемещается назад при переключении в избранное - PullRequest
1 голос
/ 08 апреля 2020

Я следую этому учебнику SwiftUI и скачал файлы проекта .

Я собрал и запустил полный проект без каких-либо изменений. В приложении, если я:

  1. Включите «Показать только избранные» в представлении списка
  2. Нажмите в подробном представлении «Скала черепахи» или «Тропа Чилкот»
  3. В подробном представлении я переключаю любимую кнопку (желтый значок звездочки)

Экран вернется к представлению списка самостоятельно.

Но если я коснусь в подробный вид последнего элемента («Озеро Святой Марии») в виде списка, я могу включать и выключать желтую звездочку и оставаться в том же подробном виде.

Может кто-нибудь объяснить это поведение? Что мне нужно сделать, чтобы оставаться в подробном представлении, не возвращаясь к списку?

Ответы [ 2 ]

3 голосов
/ 11 апреля 2020

Ну, на самом деле это дефект SwiftUI, представление, находящееся вне иерархии представления, не должно обновляться (вызывается ie. body) - оно должно обновляться сразу после следующего появления. (Я отправил отзыв # FB7659875 и рекомендую сделать то же самое для всех, кого это касается - это тот случай, когда дубликаты лучше)

Между тем, ниже возможен временный обходной путь (однако он продолжит работу даже после того, как Apple исправит вопрос, так что это безопасно). Идея состоит в том, чтобы использовать локальную модель состояния представления в качестве промежуточного между представлением и опубликованным свойством и обновлять его только тогда, когда представление является видимым.

Предоставлено только исправленное представление, подлежащее замене в упомянутом проекте.

Протестировано с Xcode 11.4 / iOS 13.4 - без неожиданного «прыжка назад»

demo

struct LandmarkList: View {
    @EnvironmentObject private var userData: UserData

    @State private var landmarks = [Landmark]() // local model
    @State private var isVisible = false        // own visibility state
    var body: some View {
        NavigationView {
            List {
                Toggle(isOn: $userData.showFavoritesOnly) {
                    Text("Show Favorites Only")
                }

                ForEach(landmarks) { landmark in
                    if !self.userData.showFavoritesOnly || landmark.isFavorite {
                        NavigationLink(
                            destination: LandmarkDetail(landmark: landmark)
                                .environmentObject(self.userData)
                        ) {
                            LandmarkRow(landmark: landmark)
                        }
                    }
                }
            }
            .onReceive(userData.$landmarks) { array in // observe external model
                if self.isVisible {
                    self.landmarks = array    // update local only if visible
                }
            }
            .onAppear {
                self.isVisible = true         // track own state
                self.landmarks = self.userData.landmarks
            }
            .onDisappear { self.isVisible = false } // track own state
            .navigationBarTitle(Text("Landmarks"))
        }
    }
}
0 голосов
/ 08 апреля 2020

это происходит потому, что в «основном» списке вы переключились на «показывать только избранное». затем вы изменяете в деталях избранное (так что оно больше не является любимым ориентиром), и поскольку в swiftui источник истины был изменен (избранное), этот элемент был удален из основного списка, и поэтому он больше не может отображаться в деталях, поскольку больше не является членом основного списка, поэтому детальный вид просто перемещается назад и показывает только избранные элементы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...