Wie kann ich ein SwiftData -Modellobjekt -Objektarray als Bindung übergeben und es aktualisieren, ohne sowohl die BindunIOS

Programmierung für iOS
Anonymous
 Wie kann ich ein SwiftData -Modellobjekt -Objektarray als Bindung übergeben und es aktualisieren, ohne sowohl die Bindun

Post by Anonymous »

In meiner App habe ich Struct namens DocumentControllerview , was im Wesentlichen zwei Schaltflächen ist. Eine, die beim Push einen .FileMporter anzeigt, mit dem der Benutzer ein PDF hinzufügen kann, das dann in einem .fullScreencover gestartet wird. Die andere zeigt eine .popover -Liste der bereits hinzugefügten PDFs an, und wenn der Benutzer eine auswählt, startet sie auch in a.

Code: Select all

fullScreenCover
. All dies erfolgt in documentControllerview . Für Kommentare, die PDFs zugeordnet sind, gibt es eine Schaltfläche in der Kommentarzeile, mit der der PDF über die DocumentControllerview startet. Der Kommentar und die hervorgehobene Passage, mit der sie verbunden ist, kann bearbeitet werden. (d. H. Drücken Sie die Taste PDF hinzufügen oder aus der Liste der bereits hinzugefügten PDFs ausgewählten) oder b) wobei das Dokument extern übergeben wird, da es aus der Kommentarliste gestartet wurde. < /p>

Code: Select all

struct DocumentControllerView: View
{
@Binding var commentToEdit: Comment?
@Binding var commentPassagesToEdit: [Passage]?
@Binding var commentDocumentToPresent: Document?

@State private var interiorDocumentToPresent: Document?

private var documentToPresent: Binding
{
Binding(get:
{
if self.commentToEdit != nil && self.commentPassagesToEdit != nil,
let commentDocumentToPresent = self.commentDocumentToPresent
{
commentDocumentToPresent
}
else
{
self.interiorDocumentToPresent
}
},
set:
{
newValue in

if (newValue == nil)
{
self.commentDocumentToPresent = nil
self.commentToEdit = nil
self.commentPassagesToEdit = nil
self.interiorDocumentToPresent = nil
}
})
}

...
Ich verstehe, dass Kommentare (und die anderen untergeordneten Eigenschaften, die ich übergeben habe) beobachtbare Modellobjekte sind, die die Benutzeroberfläche automatisch aktualisieren, wenn ich geändert wird. Der große Grund, warum ich sie als Bindungen bestehe, ist, dass ich sie in der benutzerdefinierten Bindung auf NIL festlegen kann, wenn das Dokumentfenster entlassen wird. Ich muss sie auf NIL einstellen, damit das DocumentControllerview weiß, in welchem ​​Modus er sich befindet, d. H. Wenn es einen internen oder externen PDF darstellt.

Code: Select all

commentPassagesToEdit
und commentDocumentTopresent ) liegt daran, dass in SwiftData/CloudKit alle Beziehungen optional sind. Ich stelle also sicher, dass ich diese auspackt, bevor ich das mit dem Kommentar verbundene Dokument starte:

Code: Select all

    Text(comment.text)

if let document = comment.document,
let passages = comment.passages
{
Button
{
onPresentCommentInDocument(comment, document, passages)
}
label:
{
Image(systemName: "document")
}
}
else
{
//handle error
}
Ich möchte nur eine Fehlermeldung präsentieren, wenn sie nicht auspacken können, und dann habe ich sie als solches übergeben, daher muss ich sie nur überprüfen/auspacken. self.commentpassagestoedit .

Code: Select all

.fullScreenCover(item: self.documentToPresent)
{
_ in

if let commentPassagesToEditBinding = Binding(self.$commentPassagesToEdit)
{
Button("Add Passage")
{
commentPassagesToEditBinding.wrappedValue.append(Passage())
self.commentToEdit?.passages?.append(Passage())
}

Text("commentPassagesToEditBinding.wrappedValue.count: \(commentPassagesToEditBinding.wrappedValue.count)")
Text("self.commentToEdit?.passages?.count: \(String(describing: self.commentToEdit?.passages?.count))")
}
}
< /code>
Es scheint seltsam und ich frage mich, wo sich der Fehler in meinem Design befindet.  Jede Hilfe würde geschätzt! < /P>
unten ist ein vollständig@Model
final class Comment
{
var text: String

@Relationship(deleteRule: .cascade, inverse: \Document.comment) var document: Document?
@Relationship(deleteRule: .cascade, inverse: \Passage.comment) var passages: [Passage]?

init(text: String)
{
self.text = text
self.passages = []
}
}

@Model
final class Document
{
var comment: Comment?

init()
{
}
}

@Model
final class Passage
{
var comment: Comment?

init()
{
}
}

struct ContentView: View
{
@Environment(\.modelContext) private var modelContext

@State private var commentToEdit: Comment?
@State private var commentPassagesToEdit: [Passage]?
@State private var commentDocumentToPresent: Document?

var body: some View
{
CommentList(onPresentCommentInDocument:
{
comment, document, passages in

self.commentToEdit = comment
self.commentPassagesToEdit = passages
self.commentDocumentToPresent = document
})
.toolbar
{
ToolbarItem(placement: .navigationBarLeading)
{
DocumentControllerView(commentToEdit: self.$commentToEdit,
commentPassagesToEdit: self.$commentPassagesToEdit,
commentDocumentToPresent: self.$commentDocumentToPresent)
}
}
.task
{
do
{
try modelContext.delete(model: Comment.self)

let comment = Comment(text: "Comment 1")
comment.document = Document()
comment.passages?.append(Passage())
self.modelContext.insert(comment)

}
catch
{
fatalError(error.localizedDescription)
}
}
}
}

struct CommentList: View
{
var onPresentCommentInDocument: ((Comment, Document, [Passage])  -> Void)

@Query private var comments: [Comment]

var body: some View
{
List
{
ForEach(self.comments)
{
comment in

HStack
{
Text(comment.text)

if let document = comment.document,
let passages = comment.passages
{
Button
{
onPresentCommentInDocument(comment, document, passages)
}
label:
{
Image(systemName: "document")
}
}
else
{
//handle error
}
}
}
}
}
}

struct DocumentControllerView: View
{
@Binding var commentToEdit: Comment?
@Binding var commentPassagesToEdit: [Passage]?
@Binding var commentDocumentToPresent: Document?

@State private var interiorDocumentToPresent: Document?

private var documentToPresent: Binding
{
Binding(get:
{
if self.commentToEdit != nil &&  self.commentPassagesToEdit != nil,
let commentDocumentToPresent = self.commentDocumentToPresent
{
commentDocumentToPresent
}
else
{
self.interiorDocumentToPresent
}
},
set:
{
newValue in

if (newValue == nil)
{
self.commentDocumentToPresent = nil
self.commentToEdit = nil
self.commentPassagesToEdit = nil
self.interiorDocumentToPresent = nil
}
})
}

var body: some View
{
Text("Document Controller")
.fullScreenCover(item: self.documentToPresent)
{
_ in

if let commentPassagesToEditBinding = Binding(self.$commentPassagesToEdit)
{
Button("Add Passage")
{
commentPassagesToEditBinding.wrappedValue.append(Passage())
self.commentToEdit?.passages?.append(Passage())
}

Text("commentPassagesToEditBinding.wrappedValue.count: \(commentPassagesToEditBinding.wrappedValue.count)")
Text("self.commentToEdit?.passages?.count: \(String(describing: self.commentToEdit?.passages?.count))")
}
}
}
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post