Редактирование указанного c основного объекта данных в модальном представлении - PullRequest
1 голос
/ 01 мая 2020

В процессе изучения основных данных я застрял на следующем: я отображаю список основных объектов данных в ContentView. Если пользователь хочет отредактировать один из них, он долго касается элемента в списке, который открывает контекстную таблицу с помощью кнопки и кнопки редактирования. Все идет нормально. Кнопка редактирования вызывает модальное представление, в котором будет происходить редактирование.

В представлении «Правка» я начинаю с выборки правильного элемента через его свойство UUID, которое было сохранено в UserDefaults.

Я могу отобразить имя элемента, но у меня возникает проблема с датой (у элемента есть свойство Date "eventDate".

Приложение собирается, я запускаю его на своем устройстве, но оно вылетает как как только я пытаюсь отредактировать элемент. В моем коде EditView выдается ошибка, когда я создаю экземпляр значения, которое будет отображаться сборщиком на дату события: The error

Вот что происходит внутри кнопки редактирования:

Button(action: {
      self.modalViewCaller = 1 // To tell the sheet which view to display
      UserDefaults.standard.set(item.identNumber?.uuidString, forKey: kactiveEventUUID)
      self.settingsModalIsPresented = true
                })
                 {   Text("Edit entry")
                    Image(systemName: "globe")
                }

И способ получения события в EditView:

@Environment(\.managedObjectContext) var managedObjectContext

    // We get the event to be edited through its UUID :
    @FetchRequest(entity: Takeoffs.entity(),
                  sortDescriptors: [NSSortDescriptor(keyPath: \Takeoffs.eventDate, ascending: false)],
                  predicate: NSPredicate(format: "identNumber == %@", UUID(uuidString: UserDefaults.standard.string(forKey: kactiveEventUUID)!)! as CVarArg)) var fetchedEvent: FetchedResults<Takeoffs>
        // UserDefaults.standard.object(forKey: kactiveEventUUID) as! CVarArg)

    @State var selectedDate = Date()

    init() { // This sets "selectedDate" to the event's value for the date picker
        _selectedDate = State(initialValue:  fetchedEvent.first?.eventDate ?? Date()) // The underscore is used here
    }

Проект доступен здесь, если у кого-то есть смелость: https://github.com/Esowes/RecentExp

Спасибо за любую помощь ...

[Edit:] Попытка решения .didAppear, предложенного ниже, но не могу найти представление, которое принимает .didAppear в моем тело:

        var body: some View {
            NavigationView {
                Form {
                    HStack {
                        Text("Airport : ")
                        TextField(String(fetchedEvent.first?.airportName ?? ""), text: $airportNameTextfield)
                        .disabled(airportNameTextfield.count > 2) // To limit the textField to 3 chars (IATA code)
                        Button(action: {
                            self.airportNameTextfield = ""
                        }) {
                            Image(systemName: "clear")
                            }
                    } // END of Hstack
                    Picker("", selection: $typeSelectorIndex) {
                          ForEach(0 ..< types.count) { index in
                              Text(self.types[index]).tag(index)
                          }
                      }
                      .pickerStyle(SegmentedPickerStyle())
                    //  Text("Selected type is: \(types[typeSelectorIndex])")
                    VStack {
                        Button(action: {
                            self.selectedDate = Date()
                        }) {
                            Text("Today")
                        }
                        DatePicker("",selection: $selectedDate, displayedComponents: .date)
                            .padding(30)
                            .labelsHidden()
                    }
                } // END of Form
                .navigationBarItems(
                    leading:
                    Button("Done") {
                        self.saveEdits()
                        self.presentationMode.wrappedValue.dismiss() // This dismisses the view
                    } // END of Button "Done"
                )
                .navigationBarTitle("Event edition")
            } // END of Navigation View
        } // END of some View

1 Ответ

1 голос
/ 01 мая 2020

fetchedEvent еще не доступен в View.init момент вызова, поэтому вместо этого используйте его в .didAppear, как показано ниже

// ... remove that init at all

var body: some View {
    Text("Any internal view here")    
    .onAppear {
        // assigned fetched event data, here it is available
        self.selectedDate = self.fetchedEvent.first?.eventDate ?? Date()
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...