LazyVGrid 中的 NavigationLink 循环返回所有条目,SwiftUI

Posted

技术标签:

【中文标题】LazyVGrid 中的 NavigationLink 循环返回所有条目,SwiftUI【英文标题】:NavigationLink inside LazyVGrid cycles all entries on back, SwiftUI 【发布时间】:2020-10-06 17:18:35 【问题描述】:

我有一个图像网格。每个点击的图像都应该在 NavigationView 上推送一个带有图像详细信息的视图。

导航链接按预期工作,但是当我按下后退按钮时,它会打开下一个图像,依此类推,直到它循环所有图像。怎么回事?

这是View

struct ImageGrid: View 
    
    @ObservedObject var part: Part
    @State private var showingImagePicker = false
    @State private var inputImage: UIImage?
    var body: some View 
        Button("add images")
            self.showingImagePicker = true
        
        LazyVGrid(columns: [GridItem(.adaptive(minimum:100))])
            ForEach(part.images) image in
                ZStack 
                    Image(uiImage: image.thumb)
                        .resizable()
                        .scaledToFit()
                    NavigationLink (
                        destination: ImageDetail(image:image),
                        label: 
                            EmptyView()
                        
                    ).buttonStyle(PlainButtonStyle())
                
            
        
        .sheet(isPresented: $showingImagePicker, onDismiss: loadImage) 
            ImagePicker(image: self.$inputImage)
        
        
    
    // other functions ...
    ...

这是细节View

struct ImageDetail: View 
    
    @ObservedObject var image: TrainingImage
    var body: some View 
        VStack 
            Image(uiImage: image.content)
                .resizable()
                .scaledToFit()
        
    

编辑:

这是一个隔离行为的独立示例。当网格位于表单部分内时,它似乎停止正常工作。消除表单和部分导航链接正常工作



import SwiftUI

extension String: Identifiable 
    public var id:Int 
        self.hashValue
    


struct ImageDetail: View 
    
    var image: String
    var body: some View 
        VStack 
            Image(uiImage: UIImage(systemName: image)!)
                .resizable()
                .scaledToFit()
        
    


struct ContentView: View 
    @State var images:[String] = ["plus", "minus"]
    var body: some View 
        NavigationView 
            Form 
                Section 
                    LazyVGrid(columns: [GridItem(.adaptive(minimum:100))])
                        ForEach(images) image in
                            NavigationLink (
                                destination: ImageDetail(image: image),
                                label: 
                                    Image(uiImage: UIImage(systemName: image)!)
                                        .resizable()
                                        .scaledToFit()
                                
                            ).buttonStyle(PlainButtonStyle())
                        
                    
                
            
        
    


struct ContentView_Previews: PreviewProvider 
    static var previews: some View 
        ContentView()
    


【问题讨论】:

你会准备最小可重现的例子吗? 我现在提供了一个独立的例子 【参考方案1】:

自动检测行中的链接是表单/列表功能,但是你有几个行,所以效果。解决方案是从自动检测中分离单元格视图并隐藏链接。

使用 Xcode 12.0 / ios 14 测试

struct ContentView: View 
    @State var images:[String] = ["plus", "minus"]
    var body: some View 
        NavigationView 
            Form 
                Section 
                    LazyVGrid(columns: [GridItem(.adaptive(minimum:100))])
                        ForEach(images)
                                    ImageCellView(image: $0)
                        
                    
                
            
        
    


struct ImageCellView: View 
    var image: String
    @State private var isActive = false
    var body: some View 
        Image(uiImage: UIImage(systemName: image)!)
             .resizable()
             .scaledToFit()
            .onTapGesture 
                self.isActive = true
            
        .background(
             NavigationLink (
                  destination: ImageDetail(image: image), isActive: $isActive,
                  label: 
                    EmptyView()
                  
             ))
    

【讨论】:

链接在空视图上的原因是为了避免图像右侧的披露图标,将它放在里面或外面没有区别。 这是一个解决方案,但看起来这应该由苹果在未来修复吧? 我喜欢.background 的技术,但是当我从目的地导航回来时,屏幕的背景颜色会闪烁。

以上是关于LazyVGrid 中的 NavigationLink 循环返回所有条目,SwiftUI的主要内容,如果未能解决你的问题,请参考以下文章

LazyVGrid 中的 NavigationLink 循环返回所有条目,SwiftUI

@State var 在 LazyVGrid 中未按预期更新

swiftui+combine:为啥滚动 LazyVGrid 时 isFavoriteO 改变了?

SwiftUI LazyVGrid 不显示两列

SwiftUI - 使用可扩展视图构建 LazyVGrid

您如何判断用户何时滚动到 LazyVGrid 的底部?