【问题标题】:SwiftUI [Presentation] / Attempt to present View on ... which is already presentingSwiftUI [Presentation] / Attempt to present View on ... 已经在展示
【发布时间】:2021-07-14 18:30:16
【问题描述】:

我正在开发一个 SwiftUI 应用程序,并且首先出现警告,然后出现错误,可能是因为我忽略了警告。我想显示我收到的警告,希望有人能指出我可能做错的事情。

以下是相关代码:

struct CustomListView: View {
    var localList:[SomeManagedObject], moc:NSManagedObjectContext
    @State var showingOtherView = false
    
    func handleCustomItem(_ argument: SomeManagedObject) {
        print(#function)
        self.showingOtherView.toggle()
        ..... Do useful things .....
    }
    
    var body: some View {
        List {
            ForEach(self.localList) {
                item in
                HStack {
                    Spacer()
                    Button(action: {
                        self.handleCustomItem(item)
                    })
                    {
                        Text(item.expression!)
                            .foregroundColor(Color.red))
                            .font(.headline)
                            .padding(.horizontal, 11).padding(.vertical, 15)
                    }.sheet(isPresented: $showingOtherView) {
                        OtherView()
                    }
                    Spacer()
                }
            }
        }
    }
}

这是OtherView的代码:

import SwiftUI
import CoreData

struct OtherView: View {

    var body: some View {
        Text("Hello OtherView")
    }
}

当我单击列表中的一个按钮并执行 handleCustomItem() 函数时,我可以在调试控制台中看到这些消息:

handleCustomItem(_:) 2021-04-20 22:53:10.667895+0900 TheApp[9600:5758072] [演示] 尝试演示 TtGC7SwiftUI29PresentationHostingControllerVS_7AnyView: 0x10529a510> 开启 TtGC7SwiftUI29PresentationHostingControllerVS_7AnyView: 0x10510a310>(从 TtGC7SwiftUI29PresentationHostingControllerVS_7AnyView: 0x10510a310>) 已经呈现 TtGC7SwiftUI29PresentationHostingControllerVS_7AnyView: 0x105299150>。 2021-04-20 22:53:10.668399+0900 应用程序[9600:5758072] [演示] 尝试演示 TtGC7SwiftUI29PresentationHostingControllerVS_7AnyView: 0x10529b1b0> 开启 TtGC7SwiftUI29PresentationHostingControllerVS_7AnyView: 0x10510a310>(从 TtGC7SwiftUI29PresentationHostingControllerVS_7AnyView: 0x10510a310>) 已经呈现 TtGC7SwiftUI29PresentationHostingControllerVS_7AnyView: 0x105299150>。 ...... 2021-04-20 22:53:10.670049+0900 TheApp[9600:5758072] [演示] 尝试演示 TtGC7SwiftUI29PresentationHostingControllerVS_7AnyView: 0x105118e10> 开启 TtGC7SwiftUI29PresentationHostingControllerVS_7AnyView: 0x10510a310>(从 TtGC7SwiftUI29PresentationHostingControllerVS_7AnyView: 0x10510a310>) 已经呈现 TtGC7SwiftUI29PresentationHostingControllerVS_7AnyView: 0x105299150>.

如果有人能看到一些东西并提示我可以做什么,那就太好了。

【问题讨论】:

    标签: ios xcode swiftui swiftui-list


    【解决方案1】:

    您的.sheet(isPresented: $showingOtherView) {ForEach 内。当您将showingOtherView 设置为true 时,ForEach 中的所有工作表都将尝试呈现。那是一大堆床单。

    你想把它放在ForEach之外。

    var body: some View {
        List {
            ForEach(self.localList) {
                item in
                HStack {
                    Spacer()
                    Button(action: {
                        self.handleCustomItem(item)
                    })
                    {
                        Text(item.expression!)
                            .foregroundColor(Color.red))
                        .font(.headline)
                        .padding(.horizontal, 11).padding(.vertical, 15)
                    }
                    Spacer()
                }
            }
        }
        .sheet(isPresented: $showingOtherView) { /// here should be fine
            OtherView()
        }
    }
    

    【讨论】:

    • 当我第一次尝试按照您提到的方式思考时,我发现消息的数量并不总是与列表中的行数相匹配,所以我认为这是错误的方法。但是尝试你的建议是有效的,所以你一定是对的。我当然遗漏了一些细节。
    • @Michel SwiftUI 列表延迟加载,因此消息的数量应该接近当前屏幕上的行数,负1(第一张纸不会出现问题,但之后的每张纸都会有错误消息)
    • 这是我的预期,但似乎并非如此。至少并非总是如此。或者也许每个可见单元格都有一条消息,但我没有检查过。无论如何,错误消息现在都消失了,这很好。但是现在我遇到了另一个问题,我无法将信息从单元格传递到 OtherView。我实际上为此创建了另一个帖子:stackoverflow.com/questions/67189413/…
    猜你喜欢
    • 1970-01-01
    • 2022-12-02
    • 1970-01-01
    • 2019-06-27
    • 2022-12-27
    • 1970-01-01
    • 2019-11-14
    • 2022-12-02
    • 1970-01-01
    相关资源
    最近更新 更多