SwiftUI Scrollview ломает поведение NavigationLink
У меня возникла проблема, когда я переключаю настройку в подробном представлении, и сразу после переключения настройки навигация возвращается к главному экрану. Это происходит только при использовании ScrollView вместо списка на главном экране. Кто-нибудь имеет решение или знает, если это ошибка, которая будет исправлена? Я ждал Xcode 11 Beta 7 сегодня, но это не решило проблему.
Текущее поведение с ScrollView:
- Нажмите на строку, чтобы перейти к экрану сведений
- Нажмите на начало, чтобы переключить любимую настройку
- Немедленно возвращается к главному экрану
Ожидаемое поведение с ScrollView (текущее поведение со списком):
- Нажмите на строку, чтобы перейти к экрану сведений
- Нажмите на начало, чтобы переключить любимую настройку
- Оставайтесь на экране подробностей и сможете переключать любимые настройки снова и снова
Нажмите на кнопку "Назад", чтобы вернуться на главный экран.
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. Это то, что вы собираетесь делать?