В моем приложении у меня есть struct, называемый DocumentControllerview , который по сути представляет собой две кнопки. Тот, который, когда нажимает, отображает .fileimporter , который позволяет пользователю добавить PDF, который затем запускается в. Другой отображает список PDF -файлов .popover , и если пользователь выберет один, он также запустит его в A.fullScreenCover. Все это происходит в DocumentControllerview .
В другой части пользовательского интерфейса, отделенной от DocumentControllerview , я отображаю список комментариев, которые сделал пользователь, и некоторые из этих комментариев могут быть связаны с PDF, который был добавлен через документ Controllerview (они будут подключены к выделению PDF в PDF). Для комментариев, в которых есть PDF -файлы, связанные с ними, в строке комментариев есть кнопка, которая запустит свой PDF через DocumentControllerView , поэтому комментарий и выделенный отрывок, к которому он подключен. (т.е. нажатие кнопки «Добавить PDF» или выбор из списка уже добавленных PDF) или b), где документ передается извне, потому что он был запущен из списка комментариев. < /p>
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
}
})
}
...
Я понимаю, что CommenttoEdit (и другие его свойства дочерних свойств, которые я передаю), являются наблюдаемыми объектами модели, которые автоматически обновляют пользовательский интерфейс, но большая причина, по которой я передаю их как привязки, так что я могу настроить их на NIL в пользовательском привязке, когда окно документа увольняется. Мне нужно установить их на ноль, чтобы документ ControllerView знает, в каком режиме он находится в то есть, если он представляет внутренний или внешний PDF.commentPassagesToEdit и commentdocumenttopresent ), потому что в SwiftData/CloudKit все отношения являются необязательными, поэтому я убедитесь, что их развернуть, прежде чем запустить документ, связанный с комментарием:
Text(comment.text)
if let document = comment.document,
let passages = comment.passages
{
Button
{
onPresentCommentInDocument(comment, document, passages)
}
label:
{
Image(systemName: "document")
}
}
else
{
//handle error
}
Мне просто нравится представлять сообщение об ошибке, если они не могут развернуть, а затем я передаю его как таковое, поэтому мне нужно проверить его/развернуть его один раз. Self.commentPassAgeStoedIt .
Странная проблема дизайна, которую я испытываю, состоит в том, что мне нужно добавить как к развернутую привязку Self.commentPasseDit (так что он останется актуальным, чтобы я мог ссылаться на значение в коде), а также self.commentToEdit?.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>
Необходимость делать это с обеими вещами кажется странной, и мне интересно, где находится недостаток в моем дизайне. Любая помощь будет оценена!@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))")
}
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... it-without
Как передать массив объектов модели SwiftData в качестве привязки и обновить его без необходимости обновлять как привязк ⇐ IOS
Программируем под IOS
1759263791
Anonymous
В моем приложении у меня есть struct, называемый DocumentControllerview , который по сути представляет собой две кнопки. Тот, который, когда нажимает, отображает .fileimporter , который позволяет пользователю добавить PDF, который затем запускается в. Другой отображает список PDF -файлов .popover , и если пользователь выберет один, он также запустит его в A.fullScreenCover. Все это происходит в DocumentControllerview .
В другой части пользовательского интерфейса, отделенной от DocumentControllerview , я отображаю список комментариев, которые сделал пользователь, и некоторые из этих комментариев могут быть связаны с PDF, который был добавлен через документ Controllerview (они будут подключены к выделению PDF в PDF). Для комментариев, в которых есть PDF -файлы, связанные с ними, в строке комментариев есть кнопка, которая запустит свой PDF через DocumentControllerView , поэтому комментарий и выделенный отрывок, к которому он подключен. (т.е. нажатие кнопки «Добавить PDF» или выбор из списка уже добавленных PDF) или b), где документ передается извне, потому что он был запущен из списка комментариев. < /p>
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
}
})
}
...
Я понимаю, что CommenttoEdit (и другие его свойства дочерних свойств, которые я передаю), являются наблюдаемыми объектами модели, которые автоматически обновляют пользовательский интерфейс, но большая причина, по которой я передаю их как привязки, так что я могу настроить их на NIL в пользовательском привязке, когда окно документа увольняется. Мне нужно установить их на ноль, чтобы документ ControllerView знает, в каком режиме он находится в то есть, если он представляет внутренний или внешний PDF.commentPassagesToEdit и commentdocumenttopresent ), потому что в SwiftData/CloudKit все отношения являются необязательными, поэтому я убедитесь, что их развернуть, прежде чем запустить документ, связанный с комментарием:
Text(comment.text)
if let document = comment.document,
let passages = comment.passages
{
Button
{
onPresentCommentInDocument(comment, document, passages)
}
label:
{
Image(systemName: "document")
}
}
else
{
//handle error
}
Мне просто нравится представлять сообщение об ошибке, если они не могут развернуть, а затем я передаю его как таковое, поэтому мне нужно проверить его/развернуть его один раз. Self.commentPassAgeStoedIt .
Странная проблема дизайна, которую я испытываю, состоит в том, что мне нужно добавить как к развернутую привязку Self.commentPasseDit (так что он останется актуальным, чтобы я мог ссылаться на значение в коде), а также self.commentToEdit?.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>
Необходимость делать это с обеими вещами кажется странной, и мне интересно, где находится недостаток в моем дизайне. Любая помощь будет оценена!@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))")
}
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79776588/how-do-i-pass-a-swiftdata-model-object-array-as-a-binding-and-update-it-without[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия