【问题标题】:Warning: Attempt to present * on * which is already presenting (null) SwiftUI警告:尝试在已经呈现(空)SwiftUI 的 * 上呈现 *
【发布时间】:2020-05-27 07:34:30
【问题描述】:

我对 iOS 应用程序开发和 SwiftUI 还比较陌生,我目前正在开发一款允许用户按周创建日程安排的应用程序。

我最近修改了实体,使其也接受时间输入,以便列表根据计划的时间自行组织。快速浏览一下:

Main List View

但是,当我单击每个项目时,它会将我发送到错误的事件。

在 UIKit 中,我注意到这个问题主要是由于调用了多个视图,但我看不到我将在哪里呈现多个视图。

主列表视图

            List {
                    ForEach(self.Events) { event in
                        if("\(event.dotw ?? "Unknown")" == self.name) {
                            Button(action: {
                                self.isEvent.toggle()
                            }) {
                                HStack {
                                    Text("\(event.name ?? "Unknown")")
                                        .foregroundColor(Color.white)
                                    Spacer()
                                    Text("\(event.time ?? Date(), formatter: Self.taskDateFormat)")
                                }
                            }
                            .sheet(isPresented: self.$isEvent){
                                EventView(eventName: "\(event.name ?? "Unknown")", description:  "\(event.descript ?? "Unknown")", eventTime: (event.time ?? Date())).environment(\.managedObjectContext, self.managedObjectContext)
                            }
                            .buttonStyle(ItemButton())
                        }
                    }.onDelete { indexSet in
                        let deleteItem = self.Events[indexSet.first!]
                        self.managedObjectContext.delete(deleteItem)

                        do{
                            try self.managedObjectContext.save()
                        } catch {
                            print(error)
                        }
                    }
                    Button(action: {
                        self.isPresented.toggle()
                    }) {
                        HStack {
                            Text("new")
                            Spacer()
                        }
                    }
                    .buttonStyle(NewItemButton())
                    .sheet(isPresented:$isPresented) {
                        NewEventView(dotw: self.name).environment(\.managedObjectContext, self.managedObjectContext)
                }
            }
                .onAppear {
                    UITableView.appearance().separatorStyle = .none
                }.onDisappear {
                    UITableView.appearance().separatorStyle = .singleLine
                }
                .navigationBarHidden(true)
                .navigationBarTitle("")
                .edgesIgnoringSafeArea(.top)


        }
        .edgesIgnoringSafeArea(.top)
        .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: .topLeading)

这段代码:

.sheet(isPresented: self.$isEvent){
                                EventView(eventName: "\(event.name ?? "Unknown")", description:  "\(event.descript ?? "Unknown")", eventTime: (event.time ?? Date())).environment(\.managedObjectContext, self.managedObjectContext)
                            }

我认为问题出在哪里,但我找不到任何问题

事件视图

struct EventView: View {
    var eventName: String
    var description: String
    var eventTime: Date


    var body: some View {
        VStack {
            VStack {
                Image(systemName: "chevron.compact.down")
                        .foregroundColor(.white)
                        .imageScale(.large)
                    .padding()
                HStack {
                    Text(eventName)
                        .foregroundColor(.white)
                    .font(.largeTitle)
                    .padding(.top, 15)
                    .padding(.leading, 20)
                    Spacer()
                }

                .padding(.bottom)
                .frame(maxWidth:.infinity)
            }
            .background(Color.gray)
            .shadow(color: Color.black.opacity(0.2), radius: 7, x: 3, y: 3)
            .shadow(color: Color.white.opacity(0.7), radius: 4, x: -5, y: -5)
            VStack(alignment:.leading) {
                HStack {
                    Text(description)
                        .padding(.leading, 20)
                        .padding(.top, 30)
                        .foregroundColor(.gray)
                    Spacer()
                }
                Spacer()
            }
            .frame(maxWidth:.infinity,maxHeight:.infinity)
        }
        .edgesIgnoringSafeArea(.top)
    }
}

事件实体初始化器

import Foundation
import CoreData
import SwiftUI

public class Event:NSManagedObject,Identifiable {
    @NSManaged public var name: String?
    @NSManaged public var createdAt: Date?
    @NSManaged public var descript: String?
    @NSManaged public var dotw: String?
    @NSManaged public var time: Date?
}

extension Event {

    static func getAllEvents() -> NSFetchRequest<Event> {
        let request: NSFetchRequest<Event> = NSFetchRequest<Event>(entityName: "Event")
        let sortDescriptor = NSSortDescriptor(key: "time", ascending:true)
        let sortDescriptor2 = NSSortDescriptor(key: "createdAt", ascending: true)
        request.sortDescriptors = [sortDescriptor,sortDescriptor2]
        return request
    }
}

【问题讨论】:

    标签: core-data view swiftui


    【解决方案1】:

    您的活动是否可识别?这有助于 SwiftUI 知道哪个是哪个:

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

    也可能有助于将 .id(event.id) 放入您的 ForEach 块中以在那里识别它。

    【讨论】:

    • 我在上面的代码中添加了我的事件数据实体类,它是可识别的,但我相信它是通过 sortDescriptors 的任何限制来识别的?在任何情况下,我都尝试添加一个 id,但我不确定如何在 ForEach 块中实现它。
    猜你喜欢
    • 1970-01-01
    • 2017-01-07
    • 2014-10-02
    • 1970-01-01
    • 2016-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多