Wie gehe ich mit Auswahl und Aktualisierung in MVVM um?IOS

Programmierung für iOS
Anonymous
 Wie gehe ich mit Auswahl und Aktualisierung in MVVM um?

Post by Anonymous »

Ich spiele mit MVVM herum und habe Probleme, meinen Kopf zu wickeln, wie ich mit der Auswahl eines einzelnen Elements arbeite.

Code: Select all

struct NoteListView: View {
@State private var model = NoteModel()

var body: some View {
NavigationStack {
List(model.notes) { note in
NavigationLink {
NoteDetailView(note: note)
} label: {
Text(note.title)
}
}
.task {
model.fetchNotes()
}
}
}
}

struct NoteDetailView: View {
let note: Note

var body: some View {
Text(note.title)
.font(.title)
Text(note.content)
}
}

@Observable
class NoteModel {
var notes: [Note] = []

func fetchNotes() {
self.notes = [
Note(title: "First note", content: "Test note"),
Note(title: "Reminder", content: "Don't forget to water the plants!"),
Note(title: "Shopping list", content: "Eggs, milk, hat, bread")
]
}
}

struct Note: Identifiable, Hashable {
let id = UUID()
var title: String
var content: String
}
< /code>
Jetzt möchte ich einen Hinweis in der Detailansicht aktualisieren. Die Aktualisierung beinhaltet eine Put -Anforderung an den Server mit dem Server, der Daten für das Update berechnet. Nach erfolgreicher Anforderung muss die neue Version des Hinweises abgerufen werden. Ich kann nicht herausfinden, wie ich das schreiben soll. Ich denke, das Modell würde ungefähr so aussehen.@Observable
class NoteModel {
var notes: [Note] = []
var selectedNote: Note?

func fetchNotes() {
self.notes = [
Note(title: "First note", content: "Test note"),
Note(title: "Reminder", content: "Don't forget to water the plants!"),
Note(title: "Shopping list", content: "Eggs, milk, hat, bread")
]
}

func fetchNote(title: String) {
// fetch a single note, probably used after updating a note to display the updated note on the details view
self.selectedNote = APIClient.fetchNote()
}

func updateNote(title: String, content: String) {
self.selectedNote?.title = title
self.selectedNote?.content = content
// makes a PUT request to update the note, after which the note needs to be fetched
}
}
< /code>
Aber ich weiß nicht, wie ich die ausgewählte Notiz an die Detailansicht und die Aktualisierung der in der Detailansicht angezeigten Notiz und in der Listenansicht [url=viewtopic.php?t=23808]übergeben[/url] kann. Ich stelle mir vor, dass dies ein ziemlich grundlegendes Szenario für MVVM ist, aber ich konnte keine Beispiele finden, die die grundlegenden Konventionen dazu veranschaulichen. Im folgenden Code ändert die Schaltfläche Aktualisierung den Titel und Text der Notiz in der Detailansicht.  Das Navigieren zurück setzt die Notizenliste zurück, weil die .task {} < /code> Modifier erneut auslöst, 'fetching' eine hartcodierte Liste.struct NoteListView: View {
@State private var model = NoteModel()

var body: some View {
NavigationStack {
List($model.notes) { $note in
NavigationLink {
NoteDetailView(note: $note, model: model)
} label: {
Text(note.title)
}
}
.task {
model.fetchNotes()
}
}
}
}

struct NoteDetailView: View {
@Binding var note: Note
var model: NoteModel

var body: some View {
Text(note.title)
.font(.title)
Text(note.content)

Button("Update") {
let updatedNote = Note(id: note.id, title: "\(note.title) (updated)", content: "Updated text!")
model.updateNote(note: updatedNote)
}
}
}

@Observable
class NoteModel {
var notes: [Note] = []
var selectedNote: Note?

func fetchNotes() {
print("Fetching notes...")
self.notes = [
Note(title: "First note", content: "Test note"),
Note(title: "Reminder", content: "Don't forget to water the plants!"),
Note(title: "Shopping list", content: "Eggs, milk, hat, bread")
]
}

func updateNote(note: Note) {
if let index = notes.firstIndex(where: { $0.id == note.id }) {
notes[index] = note
}
}
}

struct Note: Identifiable, Hashable {
let id: UUID
var title: String
var content: String

init(id: UUID = UUID(), title: String, content: String) {
self.id = id
self.title = title
self.content = content
}
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post