【问题标题】:SwiftUI Navigation Controller stuttering with two Navigationlinks per List rowSwiftUI 导航控制器卡顿,每个列表行有两个 Navigationlink
【发布时间】:2020-08-09 04:51:02
【问题描述】:

我正在尝试在重复列表中创建两个 NavigationLink。每个都有一个单独的目的地。在我将对根视图的调用嵌入到 List/ForEach 循环之前,代码一切正常。此时导航变得很奇怪。

尝试单击任一链接,然后单击顶部的返回指示器。它将转到一个 NavigationLink,然后转到另一个。有时以不同的顺序,有时它会从一个链接自动返回,有时它不会打开第二个详细视图,直到您从第一个详细视图返回。无论是在预览版中,还是在您构建和运行应用程序时,它都会执行此操作。

我已将代码提炼为以下最基本的代码。如果您按照 ContentView 中的指示注释 2 行,您将看到正确的行为。

我正在运行 Catalina 10.15.5、xCode 11.6,应用程序目标为 IOS 13.6。

如何修改代码,使其与 List/ForEach 循环一起使用?

import SwiftUI

struct DetailView1: View {
    var body: some View {
        HStack {
            Text("Here is Detail View 1." )}
            .foregroundColor(.green)
    }
}

struct DetailView2: View {
    var body: some View {
        HStack {
            Text( "Here is Detail View 2.") }
            .foregroundColor(.red)
    }
}

struct RootView: View {
    var body: some View {
        HStack {
            VStack {
                NavigationLink(destination: DetailView1())
                { VStack { Image(systemName: "ant.circle").resizable()
                    .frame(width:75, height:75)
                    .scaledToFit()
                }.buttonStyle(PlainButtonStyle())
                    Text("Tap for Detail 1.")
                        .foregroundColor(.green)
                }
            }
            NavigationLink(destination: DetailView2())
            { Text("Tap for Detail 2.")
                .foregroundColor(.red)
            }
        }
    }
}

struct ContentView: View {
    var body: some View {
        NavigationView {
            // Comment the following line for correct behavior
            List { ForEach(0..<3) {_ in
                RootView()
                // Comment the following line for correct behavior
                }  }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        NavigationView {
            ContentView()
                .navigationBarTitle("Strange Behavior")
        }
    }
}

【问题讨论】:

    标签: swiftui swiftui-list swiftui-navigationlink ios-navigationview swiftui-foreach


    【解决方案1】:

    在您的情况下,两个导航链接都会在用户点击一行时同时被激活,为了避免这种情况,下面是可能的方法

    使用 Xcode 12 / iOS 14 测试

    这个想法是有一个以编程方式激活的链接,并根据单击的按钮动态选择目标

    struct RootView: View {
        @State private var isFirst = false
        @State private var isActive = false
        var body: some View {
            HStack {
                VStack {
                    Button(action: {
                        self.isFirst = true
                        self.isActive = true
                    })
                    { VStack { Image(systemName: "ant.circle").resizable()
                        .frame(width:75, height:75)
                        .scaledToFit()
                    }
                        Text("Tap for Detail 1.")
                            .foregroundColor(.green)
                    }
                }
                Button(action: {
                    self.isFirst = false
                    self.isActive = true
                })
                { Text("Tap for Detail 2.")
                    .foregroundColor(.red)
                }
                .background(
                    NavigationLink(destination: self.destination(), isActive: $isActive) { EmptyView() }
                )
            }
            .buttonStyle(PlainButtonStyle())
        }
    
        @ViewBuilder
        private func destination() -> some View {
            if isFirst {
                DetailView1()
            } else {
                DetailView2()
            }
        }
    }
    

    【讨论】:

    • 这也适用于我的版本,我会接受答案,但想问一个问题。有什么方法可以设置 NavigationLinks 的区域,以便它们用于它们所附加的对象,而不是整行?
    • 目前原生 SwiftUI List 不提供这种可能性。完全可以删除链接,因此禁用默认突出显示,并制作完全自定义的解决方案,但这有点工作并且超出了主题。
    猜你喜欢
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-16
    相关资源
    最近更新 更多