如何使用 NavigationLink 进行列表视图滑动操作

Daw*_*awy 4 swiftui swiftui-navigationlink

我想知道如何将 NavigationLink 放入下面代码中的 swipeActions 部分。代码本身的编译没有任何问题,但是当我点击“编辑”链接时没有任何反应。我的目的是通过点击“编辑”来显示另一个视图。谢谢

var body: some View {
    List {
        ForEach(processes, id: \.id) { process in
            NavigationLink(process.name!, destination: MeasurementsView(procID: process.id!, procName: process.name!))
                .swipeActions() {
                    Button("Delete") {
                        deleteProcess = true
                    }.tint(.red)
                    NavigationLink("Edit", destination: ProcessView(procID: process.id!, procName: process.name!)).tint(.blue)
                }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Asp*_*eri 10

它不起作用,因为swipeActions上下文超出了NavigationView。相反,我们可以NavigationLink根据操作使用相同的条件导航。

这是可能方法的简化演示 - 使目的地成为有条件的并使用链接的编程激活。

使用 Xcode 13.2 / iOS 15.2 进行测试

演示

struct ContentView: View {
    var body: some View {
        NavigationView {
            List {
                ForEach(0..<2, id: \.id) {
                    // separate into standalone view for better
                    // state management
                    ProcessRowView(process: $0)
                }
            }
        }
    }
}

struct ProcessRowView: View {
    enum Action {
        case view
        case edit
    }
    @State private var isActive = false
    @State private var action: Action?
    let process: Int

    var body: some View {
        // by default navigate as-is
        NavigationLink("Item: \(process)", destination: destination, isActive: $isActive)
            .swipeActions() {
                Button("Delete") {

                }.tint(.red)
                Button("Edit") {
                    action = .edit    // specific action
                    isActive = true   // activate link programmatically
                }.tint(.blue)
            }
            .onChange(of: isActive) {
                if !$0 {
                    action = nil  // reset back
                }
            }
    }

    @ViewBuilder
    private var destination: some View {
        // construct destination depending on action
        if case .edit = action {
            Text("ProcessView")
        } else {
            // just to demo different type destinations
            Color.yellow.overlay(Text("MeasurementsView"))
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果我们不需要/想要一个 NavigationLink 作为行视图怎么办?我有一行在正常触摸时不应导航(并且不应通过扩展显示导航克拉指示器),但希望能够滑动以显示编辑按钮,然后点击该按钮以转到编辑视图。 (3认同)