SwiftUI NavigationLink 自行弹出

时间:2021-03-10 07:00:51

标签: swiftui swiftui-navigationlink

我有一个简单的用例,一个屏幕使用 NavigationLink 推送另一个屏幕。 iOS 14.5 beta (1, 2, 3) 有一个奇怪的行为,推送的屏幕刚被推送就弹出。

我设法创建了一个示例应用程序,并在其中重现它。我相信原因是 @Environment(\.presentationMode) 的存在似乎重新创建了视图并导致推送的视图被弹出。

完全相同的 cod 在 Xcode 12 / iOS 14.4 中运行良好

enter image description here

这是一个示例代码。

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: thirdScreenA) {
                Text("Link to Third Screen A")
            }

            NavigationLink(destination: thirdScreenB) {
                Text("Link to Third Screen B")
            }

            Button("Go back", action: { presentationMode.wrappedValue.dismiss() })
        }

    }

    var thirdScreenA: some View {
        Text("thirdScreenA")
    }

    var thirdScreenB: some View {
        Text("thirdScreenB")
    }
}


struct FirstScreen_Previews: PreviewProvider {
    static var previews: some View {
        FirstScreen()
    }
}

1 个答案:

答案 0 :(得分:9)

当正好有 2 个 NavigationLink 时,这看起来像是一个错误。 如果您添加另一个空链接,它就会消失:

if(studentObj.Name != null && studentObj.Code != null) 
   return "invalid";
if(studentObj.Name != null && studentObj.SNumber != null) 
   return "invalid";
if(studentObj.Code != null && studentObj.SNumber != null) 
   return "invalid";

更多详情:https://forums.swift.org/t/14-5-beta3-navigationlink-unexpected-pop/45279