Предупреждение: попытка представить * на *, который уже представляет (null) SwiftUI - PullRequest
1 голос
/ 27 мая 2020

Я относительно новичок в разработке приложений iOS, а также в SwiftUI, и в настоящее время я работаю над приложением, которое позволяет пользователю создавать расписание по неделям.

Недавно я изменил объект, чтобы он также принимайте временные данные, чтобы списки организовывались в соответствии со временем, на которое они были запланированы. Вот краткий обзор:

Основной вид списка

Однако, когда я нажимаю на каждый элемент, он отправляет меня в неправильное событие.

В 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
    }
}

1 Ответ

0 голосов
/ 27 мая 2020

Можно ли идентифицировать ваши События? Это помогает SwiftUI узнать, что есть что:

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

Может также помочь поместить .id(event.id) в ваш блок ForEach, чтобы идентифицировать его и там.

...