SwiftUI Scrollview ломает поведение NavigationLink

У меня возникла проблема, когда я переключаю настройку в подробном представлении, и сразу после переключения настройки навигация возвращается к главному экрану. Это происходит только при использовании ScrollView вместо списка на главном экране. Кто-нибудь имеет решение или знает, если это ошибка, которая будет исправлена? Я ждал Xcode 11 Beta 7 сегодня, но это не решило проблему.

Текущее поведение с ScrollView:

  1. Нажмите на строку, чтобы перейти к экрану сведений
  2. Нажмите на начало, чтобы переключить любимую настройку
  3. Немедленно возвращается к главному экрану

Ожидаемое поведение с ScrollView (текущее поведение со списком):

  1. Нажмите на строку, чтобы перейти к экрану сведений
  2. Нажмите на начало, чтобы переключить любимую настройку
  3. Оставайтесь на экране подробностей и сможете переключать любимые настройки снова и снова
  4. Нажмите на кнопку "Назад", чтобы вернуться на главный экран.

    import SwiftUI
    import Combine
    
    struct Sport: Identifiable{
        var id = UUID()
        var name : String
        var isFavorite = false
        var school : String
    }
    
    final class UserData: ObservableObject  {
        @Published var sportsData =
            [
                Sport(name: "soccer", isFavorite: false, school: "WPI"),
                Sport(name: "tennis", isFavorite: true, school: "WPI"),
                Sport(name: "swimming", isFavorite: true, school: "WPI"),
                Sport(name: "running", isFavorite: true, school: "RIT"),
        ]
    }
    
    struct ContentView: View {
        @EnvironmentObject var userData: UserData
    
        var body: some View {
            NavigationView{
                List{
                    ForEach(userData.sportsData){ sport in
                        if sport.isFavorite{
                            NavigationLink(destination:
                                DetailsView(sport: sport)
                            ){
                                HStack {
                                    Text(sport.name)
                                    Spacer()
                                    Image(systemName: "star.fill")
                                        .foregroundColor(sport.isFavorite ? .yellow : .gray)
                                }
                            }
    
                        }
    
                    }
                }
            }.navigationBarTitle("Settings")
        }
    }
    
    struct DetailsView: View {
        @EnvironmentObject var userData: UserData
        var sport: Sport
        var sportIndex: Int {
            userData.sportsData.firstIndex(where: { $0.id == sport.id })!
        }
    
        var body: some View {
            ZStack {
                Text(sport.name).offset(x: 0, y: 100)
                Button(action: {
                    self.userData.sportsData[self.sportIndex].isFavorite.toggle()
                    print(self.sport.isFavorite)
                }) {
                    Image(systemName: "star.fill")
                        .foregroundColor(self.userData.sportsData[self.sportIndex].isFavorite ? .yellow : .gray)
                }
            }.padding(.horizontal)
        }
    }
    
    
    
    #if DEBUG
    struct Testing_Previews: PreviewProvider {
        static var previews: some View {
            ContentView()
                .environmentObject(UserData())
        }
    }
    #endif
    

1 ответ

одна вещь, которая может повлиять на это, - похоже, что вы уничтожаете исходную NavigationLink в forEach, если favorite == false.

Так что, если это NavigationLink, на который мы пришли к деталям, то он исчезает, когда для избранного установлено значение false. Это то, что вы собираетесь делать?

Другие вопросы по тегам