我有一个简单的用例,其中一个屏幕使用NavigationLink. iOS 14.5 beta (1, 2, 3) 有一个奇怪的行为,推送的屏幕在被推送后就弹出。
我设法创建了一个示例应用程序,并在其中重现它。我相信原因是存在@Environment(\.presentationMode)似乎重新创建视图并导致弹出视图的原因。
完全相同的 cod 在 Xcode 12 / iOS 14.4 中运行良好
这是一个示例代码。
import SwiftUI
public struct FirstScreen: View {
public init() {}
public var body: some View {
NavigationView {
List {
row
row
row
}
}
}
private var row: some View {
NavigationLink(destination: SecondScreen()) {
Text("Row")
}
}
}
struct SecondScreen: View {
@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
public var body: some View {
VStack(spacing: 10) {
NavigationLink(destination: …Run Code Online (Sandbox Code Playgroud) 尝试以编程方式触发导航链接时遇到上述错误的问题。单击链接后,错误的目标数组元素将偶尔加载(相对于单击的标签),当然会显示上述错误。
当我以非编程方式触发导航链接时,不会发生错误,但当用户单击此链接时,我需要运行另一种方法。
我已经阅读了几个问题,例如此处和此处,但找不到我的案例的原因。
模型结构:
struct Place: Identifiable {
var id: UUID = UUID()
var name: String = ""
var testBool: Bool = false
Run Code Online (Sandbox Code Playgroud)
}
环境对象的类:(生产项目有许多属性和方法 - 本质上这是 ViewModel)
class UserPlaces: ObservableObject {
@Published var placesArray: [Place] = [Place]([Place(name: "Christian", testBool: false),Place(name: "Catherine", testBool: true)])
Run Code Online (Sandbox Code Playgroud)
}
导航布尔类:(生产项目这里有许多属性,我想将它们保留在一个类中)
class Navigation: ObservableObject {
@Published var showPlaceDetail: Bool = false
Run Code Online (Sandbox Code Playgroud)
}
ContentView:(NavigationView所在的父视图)
import SwiftUI
Run Code Online (Sandbox Code Playgroud)
结构ContentView:视图{
var body: some View {
NavigationView {
ScrollView {
Text("Hello, world!")
.padding()
CardsGrid2()
} // …Run Code Online (Sandbox Code Playgroud)