SwiftUI Scrollview 破坏了 NavigationLink 行为
SwiftUI Scrollview Breaks NavigationLink Behavior
我在详细信息视图中切换设置时遇到问题,切换设置后,导航立即弹回到主屏幕。只有在主屏幕上使用 ScrollView 而不是 List 时才会发生这种情况。有没有人有解决方案或知道这是否是将要修复的错误?我今天等待 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: { [=10=].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
可能影响这一点的一件事是,如果 favorite == false
。
,您似乎正在破坏 forEach 中的原始 NavigationLink
因此,如果那是我们进入详细信息的 NavigationLink,那么当收藏夹设置为 false 时它就会消失。这是你打算做的吗?
我在详细信息视图中切换设置时遇到问题,切换设置后,导航立即弹回到主屏幕。只有在主屏幕上使用 ScrollView 而不是 List 时才会发生这种情况。有没有人有解决方案或知道这是否是将要修复的错误?我今天等待 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: { [=10=].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
可能影响这一点的一件事是,如果 favorite == false
。
因此,如果那是我们进入详细信息的 NavigationLink,那么当收藏夹设置为 false 时它就会消失。这是你打算做的吗?