Swiftui, удерживая ссылку на удаленную основную объект данных, вызывая сбойIOS

Программируем под IOS
Ответить
Anonymous
 Swiftui, удерживая ссылку на удаленную основную объект данных, вызывая сбой

Сообщение Anonymous »

Я не нахожу невозможным использовать основные данные с помощью swiftui, поскольку, когда я передаю основные данные с наблюдаемой переменной объекта, представление о навигационной ссылке будет содержать ссылку на объект даже после того, как представление исчезнет, ​​поэтому, как только я удаляю объект из контекста, приложение сбивает, без сообщений об ошибках. Nil сразу после контекста удалить действие, и приложение работает нормально, но это не решение, потому что мне нужен основной объект данных, чтобы связываться с просмоткой ui Swift и быть источником истины. Как это должно работать? Я серьезно не могу сделать что -то удаленно сложным со Swiftui, кажется, что. < /p>

Я попытался назначить переданный в основной объект данных опциональному @state, но это не работает. Я не могу использовать @Binding, потому что это полученный объект. И я не могу использовать переменную, поскольку элементы управления Swiftui требуют привязки. It only makes sense to use a @ObservedObject, but this cannot be an optional, which means when the object assigned to it gets deleted, the app crashes, because i cannot set it to nil.

Here is the core data object, which is an observable object by default:

class Entry: NSManagedObject, Identifiable {

@NSManaged public var date: Date
}
< /code>

Вот представление, которое передает основной объект ввода данных в другое представление. < /p>

struct JournalView: View {

@Environment(\.managedObjectContext) private var context

@FetchRequest(
entity: Entry.entity(),
sortDescriptors: [],
predicate: nil,
animation: .default
) var entries: FetchedResults

var body: some View {
NavigationView {
List {
ForEach(entries.indices) { index in
NavigationLink(destination: EntryView(entry: self.entries[index])) {
Text("Entry")
}
}.onDelete { indexSet in
for index in indexSet {
self.context.delete(self.entries[index])
}
}
}
}
}
}
< /code>

Теперь вот представление, которое обращается к всем атрибутам из объекта ввода данных, который был передан. Однажды я удаляю эту запись, кстати, кстати, на него все еще ссылаются здесь и приводят к сбою приложения. Я полагаю, что это также связано с тем, что ссылка на навигацию инициализации всех представлений о назначении еще до того, как они будут доступны. Что не имеет смысла, почему это сделало бы это. Это ошибка, или есть лучший способ достичь этого? Даже если я сделаю Delete из журнала, он все равно будет терпеть неудачу, так как навигационная связь все еще ссылается на объект. Интересно, что он не будет сбой, если удалить навигационную связь, которая еще не была нажата. < /P>

struct EntryView: View {

@Environment(\.managedObjectContext) private var context
@Environment(\.presentationMode) private var presentationMode

@ObservedObject var entry: Entry

var body: some View {
Form {

DatePicker(selection: $entry.date) {
Text("Date")
}

Button(action: {
self.context.delete(self.entry)
self.presentationMode.wrappedValue.dismiss()
}) {
Text("Delete")
}
}
}
}
< /code>

Обновление < /strong> < /p>

Сбой приводит меня к первому использованию записи в записи и считывает Поток 1: Exc_bad_instruction (Code = exc_i386_invop, subcode = 0x0). может подумать, чтобы добавить свойство в основной объект данных «Isdeleted» и установить его на True, а не пытаться удалить из контекста. Затем, когда приложение уходит или при запуске, я могу очистить и удалить все записи, которые смельровали? Не идеально, и предпочел бы выяснить, что здесь не так, так как кажется, что я не делаю ничего другого, чем образец MasterDetailApp, который, кажется, работает.

Подробнее здесь: https://stackoverflow.com/questions/591 ... sing-crash
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»