首页 > 解决方案 > 从列表中关闭 SwiftUI 模态“工作表”

问题描述

我正在尝试在列表中呈现模式。模态在测试版中已经改变了很多次,但我相信我使用的是正确/最新的方式(从 Xcode Beta 7 开始)。但是,当我从列表中触发模式时,对于每个列表项,它都会打开一次,但以后再也不会打开。

import SwiftUI

//This works perfectly fine

struct BasicTest : View {

struct SampleObject: Identifiable {
    var id = UUID()
    var name: String
}

let sampleObjects = [
        SampleObject(name: "Buffalo"),
        SampleObject(name: "Italy"),
        SampleObject(name: "Portland"),
    ]
@State private var showModal:Bool = false

var body: some View {

    Button(action: {
        print("Modal to open")
        self.showModal = true

    }) {
        Text("Show Modal")

    }.sheet(isPresented: self.$showModal)
        {
            TestDetailView(name: "Example")
        }
    }
}

#if DEBUG
struct BasicTest_Previews: PreviewProvider {
    static var previews: some View {
        BasicTest()
        }
}
#endif

//this one only opens once
struct ListTest : View {

    struct SampleObject: Identifiable {
        var id = UUID()
        var name: String
    }

    let sampleObjects = [
            SampleObject(name: "Buffalo"),
            SampleObject(name: "Italy"),
            SampleObject(name: "Portland"),
        ]
    @State private var showModal:Bool = false

    var body: some View {
            List {
                ForEach(sampleObjects) {
                    item in
                    Button(action: {
                        print("Modal to open")
                        self.showModal = true

                    }) {
                        Text("Show Modal for \(item.name)")

                    }.sheet(isPresented: self.$showModal)
                        {
                            TestDetailView(name: item.name)
                        }
                    }
                }
            }
        }

#if DEBUG
struct ListTest_Previews: PreviewProvider {
    static var previews: some View {
        ListTest()
        }
}
#endif

struct TestDetailView: View {

    @Environment(\.presentationMode) var presentationMode
    var name: String

    var body: some View {
        VStack {
            Button(action: {
                print("Button clicked")
                self.presentationMode.wrappedValue.dismiss()
                }) {
                    Image(systemName: "chevron.compact.down").font(Font.system(.largeTitle).bold())
                }
            Text(name)
        }
    }
}







我看不到任何错误消息,只是在尝试第二次打开时闪烁。

标签: swiftui

解决方案


如果您为列表行创建一个视图并将 .sheet() 移动到那里,它将起作用


推荐阅读