适用于 iOS 14.5 的 SwiftUI NavigationLink 不起作用

Lea*_*ode 22 xcode ios swift swiftui

我在 Xcode 12.4 中有以下代码完美运行

ScrollView(.horizontal, showsIndicators: false) {
        
    LazyHGrid(rows: rows, spacing: 0) {
            
        HStack {
                        
            if (type == "Quiz") {
                        
                NavigationLink(destination: Quiz(id: quiz.id)) {
                                
                    VStack(alignment: .leading) {
                                    
                        Text("Quiz")
                            .font(.headline)
                            .foregroundColor(.white)
                            .padding(.top, 8)
                            .padding(.leading)
     
                    }
                    .background(Color.green)
                    .cornerRadius(12)
                    .shadow(color: .green, radius: 3, x: 0.0, y: 0.0)
                            
                }
                            
            } else {
                            
                NavigationLink(destination: Survey(id: survey.id)) {
                                
                    VStack(alignment: .leading) {
                                    
                        Text("Survey")
                            .font(.headline)
                            .foregroundColor(.white)
                            .padding(.top, 8)
                            .padding(.leading)
                                    
                    }
                    .background(Color.green)
                    .cornerRadius(12)
                    .shadow(color: .green, radius: 3, x: 0.0, y: 0.0)
                            
                }
                            
           } // End If
                    
           if (type == "Quiz") {
                        
               NavigationLink(destination: QuizResults(id: quiz.id)) {
                                
                   VStack(alignment: .leading) {
                            
                       Text("Quiz Results")
                           .font(.headline)
                           .foregroundColor(.white)
                           .padding(.top, 8)
                           .padding(.leading) 
                        
                   }
                   .background(Color.blue)
                   .cornerRadius(12)
                   .shadow(color: .blue, radius: 3, x: 0.0, y: 0.0)
                                
               }
                            
           } else {
                                
               NavigationLink(destination: SurveyResults(id: survey.id)) {
                                    
                   VStack(alignment: .leading) {
                                
                       Text("Survey Results")
                           .font(.headline)
                           .foregroundColor(.white)
                           .padding(.top, 8)
                           .padding(.leading)
                            
                   }
                   .background(Color.blue)
                   .cornerRadius(12)
                   .shadow(color: .blue, radius: 3, x: 0.0, y: 0.0)
                                    
              }
                                
          } 
                    
      }
      .padding([.leading, .trailing], 25)
            
}
.frame(height: 100)
Run Code Online (Sandbox Code Playgroud)

我刚刚将 Xcode 更新到 12.5,上面的不再起作用。

它在 12.4 中运行良好!?

现在,当我单击“测验”元素时,它开始过渡到测验视图,该视图显示它但立即关闭视图,我又回到了详细信息视图!?

有人可以看到我做错了什么,为什么现在根据 12.5 的更新停止工作?

更新

我将代码改进为最小的可重现形式。似乎正在发生的是我有两个或更多的NavigationLinks 集。

第一个是将用户导航到测验或调查的集合,if 语句将用户引导到要填写的正确视图。

12.5 中的问题在于,用户可以单击以查看测验或调查的整体结果的第二组在第一次导航之后直接不起作用。

就像我之前说的那样,它在 12.4 中运行良好,但似乎 12.5 不同意。有人可以为用户提供一种更好的方式来单击元素以填写测验或调查或查看测验或调查的结果吗?

小智 21

我遇到了完全相同的问题,在 Xcode 12.4 上一切正常。

https://developer.apple.com/forums/thread/677333

我尝试关注此线程,它可能会起作用,但在某些情况下,我仍然有此错误。

       NavigationLink(destination: EmptyView()) {
           EmptyView()
       }
Run Code Online (Sandbox Code Playgroud)

显然,您可以将这 3 行代码放在您的 NavigationLink 附近...如果有人得到更好的答案,我将不胜感激!

  • 我注意到使用 EmptyView 的解决方案会引发以下错误“无法呈现”。请提交一个错误。`不确定这是否是一个大问题,而不仅仅是白噪音,但我希望苹果不会阻止该应用程序从他们的商店!? (2认同)

sal*_*000 5

多么可怕的错误!根据我的测试和一些谷歌搜索,当视图中恰好有 2 个导航链接时,就会发生这种情况。问题中的代码有 4 个,但由于 if else 语句,一次实际上只有 2 个。

我经常不知道我将拥有多少导航链接,因为这取决于用户添加的数据/有多少搜索点击等。为了安全起见,我已经制作了一个tripleEmptyNavigationLink 修饰符,我一直卡在最后我所有的观点。它正在解决弹出行为,但我仍然收到“无法呈现”警告。很想知道是否有人有比这更好的东西!


import SwiftUI

struct TripleEmptyNavigationLink: View {
    var body: some View {
        VStack {
        NavigationLink(destination: EmptyView()) {EmptyView()}
        NavigationLink(destination: EmptyView()) {EmptyView()}
        NavigationLink(destination: EmptyView()) {EmptyView()}
            
        }
    }
}


struct TripleEmptyNavigationLinkBackground: ViewModifier {
    func body(content: Content) -> some View {
        content
            .background(TripleEmptyNavigationLink())
    }
}



extension View {
    func tripleEmptyNavigationLink()-> some View {
        self.modifier(TripleEmptyNavigationLinkBackground())
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

MyView()
.tripleEmptyNavigationLink()
Run Code Online (Sandbox Code Playgroud)


123*_*234 5

在Xcode13 beta中仍然存在这个问题。

\n

到目前为止解决方案:

\n

1\xe3\x80\x81用列表或表单包裹NavigationLink:

\n
    List {\n        NavigationLink(destination: Text("1")) {\n            Text("1")\n        }\n        NavigationLink(destination: Text("2")) {\n            Text("2")\n        }\n        NavigationLink(destination: Text("3")) {\n            Text("3")\n        }\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

2\xe3\x80\x81或者使用一个NavigationLink,并从func创建目标视图:

\n
struct TaskIndexPage: View {\n    \n    func buildView() -> some View {\n        // return you destination\n        switch self.option {\n        case 1:\n            return Text("\\(option)")\n        default:\n            return Text("\\(option)")\n        }\n    }\n    \n    @State private var showDetail: Bool = false\n\n    @State private var option: Int = 0\n\n    var body: some View {\n\n        VStack {\n            Button {\n                showDetail = true\n                option = 1\n            } label: { Text("button 1") }\n            Button {\n                showDetail = true\n                option = 2\n            } label: { Text("button 2") }\n            Button {\n                showDetail = true\n                option = 3\n            } label: { Text("button 3") }\n        }\n        // handle navigating\n        NavigationLink(destination: self.buildView(), isActive: $showDetail) {}.opacity(0)\n        \n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n