iOS 14.5的SwiftUI NavigationLink不工作

iOS 14.5的SwiftUI NavigationLink不工作,ios,swift,xcode,swiftui,Ios,Swift,Xcode,Swiftui,我在Xcode 12.4中有以下代码,它们工作得非常好 ScrollView(.horizontal, showsIndicators: false) { LazyHGrid(rows: rows, spacing: 0) { HStack { if (type == "Quiz") {

我在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)
我刚刚将Xcode更新为12.5,上面的代码不再有效

它在12.4中运行良好

现在,当我单击“quick”元素时,它开始转换到显示它的quick视图,但立即关闭视图,我又回到了详细视图

有人能看到我做错了什么吗?为什么现在基于12.5的更新,这个停止工作了

更新

我将代码细化到尽可能小的可复制形式。似乎发生的是我有两个或更多的
NavigationLink
s集合

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

12.5中的问题是,第二组用户可以点击查看测验或调查的总体结果的设置在第一次导航之后不起作用


正如我之前所说,它在12.4中工作得很好,但12.5似乎不同意它。有人能为用户提供一种更好的方法来单击某个元素以填写测验或调查,或查看测验或调查的结果吗?

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

我试图遵循这个思路,它可能会工作,但在某些情况下,我仍然有这个错误

显然,您可以将这3行代码放在导航链接附近。。。
如果有人能得到更好的答案,我会非常感激

多么可怕的虫子!根据我的测试和谷歌搜索,当一个视图中正好有两个导航链接时,就会发生这种情况。问题中的代码有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())
    }
}
用法:

MyView()
.tripleEmptyNavigationLink()

我也有同样的问题

我的代码:

class NavigationManager: ObservableObject {
    
    static let shared: NavigationManager = {
        return NavigationManager()
    }()
    
    @Published var showingMain: Bool
    @Published var showingSub: Bool
    @Published var content: AnyView

    init() {
        showingMain = false
        showingSub = false
        content = AnyView(EmptyView())
    }
    
    func forward<T:View>(content: @escaping () -> T ) {
        showView()
        self.content = AnyView(content())
    }
    
    private func showView() {
        if !showingMain,!showingSub {
            showingMain = true
        } else if showingMain,!showingSub {
            showingSub = true
        } else if !showingMain,showingSub {
            showingMain = true
        }
    }
}

与iOS 14.5.1上的任何其他应用程序一样,我的应用程序也受到了这个可怕的错误的影响。我在页面中有3个以上的NavigationLink,我没有幸运地修改NavigationLink的数量(通过添加一个虚拟NavigationLink)以获得正确的行为

对我来说,一个可行的解决方法是有条件地将NavigationLink添加到视图中

而不是:

var body: some View {
  NavigationLink(destination: AnotherView(), isActive: $someCondition) { EmptyView() }
}
我有这个:

var body: some View {
  if someCondition {
    NavigationLink(destination: AnotherView(), isActive: $someCondition) { EmptyView() }
  }
}
这种行为并不完全相同,因为您丢失了一些导航动画糖果,但至少您又有了一个相对容易理解的应用程序

您还可以将其短路至14.5,并在其他地方正常运行:

  /// Assumes this gets fixed by Apple until 14.6 is out
  var onIOS14_5: Bool {
    let systemVersion = UIDevice.current.systemVersion
    return systemVersion.starts(with: "14.5")
  }

  var body: some View {

  if !onIOS14_5 || someCondition {
    NavigationLink(destination: AnotherView(), isActive: $someCondition) { EmptyView() }
  }
}

也许这对某些人有帮助,让所有人都希望苹果能修复这个令人尴尬的错误。现在我想要回我的半天。

在我的情况下,我不需要显示
导航链接,所以我只需要用一个不可见的
列表来包装它们,就像这样

List {
    NavigationLink(...)
    NavigationLink(...)
}.opacity(0)

然后它们正常工作(我不知道如何),没有无法显示警告,这只发生在iOS 14.5中。

添加带有空视图的导航链接对我不起作用。我解决了我的问题,从ForEach中删除了所有的
NavigationLink
s,并使用一个来控制到细节视图的导航,一个点击手势和两个状态变量来跟踪点击的内容

在Paul Hudson的网站上可以找到示例中断代码和修复

以下是完整的工作版本

导入快捷界面
结构导航视图选项{
枚举选项类型{case main,可选}
typealias选项=(id:UUID,值:字符串,类型:Self.OptionType)
静态变量选项:[选项]=[
(UUID(),“选项1”,.main),
(UUID(),“选项2”,.可选),
(UUID(),“选项3”,.main),
(UUID(),“选项4”,.main),
(UUID(),“选项5”,.可选),
]
静态func构建视图(用于选项:option)->某些视图{
开关选项.type{
主要案例:
返回文本(“选定的主选项\n\(Option.value)”).font(.title).fontwweight(.bold)
案例。可选:
返回文本(“选择的可选选项\n\(Option.value)”).font(.title3).italic().fontWeight(.medium)
}
}
}
结构导航视图工作:视图{
//leep状态变量跟踪已点击的选项以及何时导航到新视图
@状态私有变量selectedOption:NavigationViewOptions.Option=(id:UUID(),“”,.main)
@国家私有变量showDetail:Bool=false
var body:一些观点{
导航视图{
滚动视图{
VStack(对齐:。前导){
文本(“导航修复:\n无法显示。请提交错误。”)
.padding(.bottom,40)
ForEach(NavigationViewOptions.options,id:\.id){中的选项
文本(option.value)
.font(.title)
.padding(.vertical,10)
.foregroundColor(.accentColor)//与navigationLink颜色相同
//手柄点击选项
.ontapsigne{
selectedOption=选项
showDetail=true
}
}
垫片()
NavigationLink(“”,目标:NavigationViewOptions.buildView(for:selectedOption),isActive:$showDetail)
.不透明度(0)
}
.navigationTitle(“选项”)
}
//初始详细视图
文本(“选择选项f
var body: some View {
  if someCondition {
    NavigationLink(destination: AnotherView(), isActive: $someCondition) { EmptyView() }
  }
}
  /// Assumes this gets fixed by Apple until 14.6 is out
  var onIOS14_5: Bool {
    let systemVersion = UIDevice.current.systemVersion
    return systemVersion.starts(with: "14.5")
  }

  var body: some View {

  if !onIOS14_5 || someCondition {
    NavigationLink(destination: AnotherView(), isActive: $someCondition) { EmptyView() }
  }
}
List {
    NavigationLink(...)
    NavigationLink(...)
}.opacity(0)