J'ai un ObservableObject déclaré comme ceci dans mon DateView :
import SwiftUI
class SelectedDate: ObservableObject {
@Published var selectedMonth: Date = Date()
var startDateOfMonth: Date {
let components = Calendar.current.dateComponents([.year, .month], from: self.selectedMonth)
let startOfMonth = Calendar.current.date(from: components)!
return startOfMonth
}
var endDateOfMonth: Date {
var components = Calendar.current.dateComponents([.year, .month], from: self.selectedMonth)
components.month = (components.month ?? 0) + 1
let endOfMonth = Calendar.current.date(from: components)!
return endOfMonth
}
}
struct DateView: View {
// other code
}
Je peux accéder à startDateOfMonth et endDateOfMonth dans d'autres vues comme celle-ci:
Text("\(self.selectedDate.startDateOfMonth)")
Mais j'ai un problème lorsque j'essaie d'utiliser ces variables d'ObservableObject dans un initialiseur fetchRequest dans mon TransactionsListView :
import SwiftUI
struct TransactionsListView: View {
@Environment(\.managedObjectContext) var managedObjectContext
var fetchRequest: FetchRequest<NPTransaction>
var transactions: FetchedResults<NPTransaction> { fetchRequest.wrappedValue }
@EnvironmentObject var selectedDate: SelectedDate
// other code
init() {
fetchRequest = FetchRequest<NPTransaction>(entity: NPTransaction.entity(), sortDescriptors: [
NSSortDescriptor(keyPath: \NPTransaction.date, ascending: false)
], predicate: NSPredicate(format: "date >= %@ AND date < %@", self.selectedDate.startDateOfMonth as NSDate, self.selectedDate.endDateOfMonth as NSDate))
}
var body: some View {
// other code
}
}
J'obtiens une erreur:
Variable 'self.fetchRequest' utilisée avant d'être initialisée
Qu'est-ce que je fais de mal? J'ai essayé d'utiliser ces variables dans init sans self. Même erreur. La seule façon dont cela fonctionnait était si ces startDateOfMonth et endDateOfMonth n'étaient pas dans ObservableObject, mais en tant que vars en vue des ancêtres que je transmettais en tant que paramètres à ma vue avec fetchRequest init. Mais j'ai peu de vues comme celle-ci et je voulais utiliser ObservableObject, ne pas passer les mêmes paramètres aux sous-vues tout le temps.
Le problème est que vous ne pouvez pas utiliser @EnvironmentObjectdans le init(). L'option possible ici est de passer le EnvironmentObjectparamètre as à la vue. Ensuite, utilisez ce paramètre dans le fichier init. Voici le constructeur de la vue, alors vous pouvez accéder à start et endTime avec une variable locale selectedDate.
init(selectedDate : SelectedDate)
{
//now you can access selectedDate here and use it in FetchRequest
fetchRequest = FetchRequest<NPTransaction>(entity: NPTransaction.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \NPTransaction.date, ascending: false)], predicate: NSPredicate(format: "date >= %@ AND date < %@", selectedDate.startDateOfMonth as NSDate, selectedDate.endDateOfMonth as NSDate))
}
Là où vous appelez cette vue, transmettez le EnvironmentObjectparamètre as.
//Declared as Environment Object
TransactionsListView(selectedDate : self.selectedDate)
Swift garantit que toutes les propriétés sont initialisées après init.
Lorsque vous accédez à la propriété de l'objet, on suppose que l'objet est déjà initialisé, ce qui n'est pas le cas lorsque vous y accédez au milieu de l'initialisation.
Ce qui se passe, c'est que lorsque vous initialisez fetchRequest, vous accédez self.selectedDate(même au compilateur, que vous ajoutiez self ou non), ce qui suggère que self est initialisé, ce qui implique que fetchRequest, comme l'une des propriétés du self, est prêt à être utilisé. D'où l'erreur du compilateur:
Variable 'self.fetchRequest' utilisée avant d'être initialisée
Faire fetchRequestune propriété calculée ou paresseuse devrait fonctionner. (pas trop familier avec @FetchRequest)
J'espère que cela t'aides.
Vous pouvez le transmettre en tant que paramètre à la vue:
import SwiftUI
struct TransactionsListView: View {
@Environment(\.managedObjectContext) var managedObjectContext
@FetchRequest var transactions: FetchedResults<NPTransaction>
init(selectedDate: SelectedDate) {
_transactions = FetchRequest(sortDescriptors: [NSSortDescriptor(keyPath: \NPTransaction.date, ascending: false)], predicate: NSPredicate(format: "date >= %@ AND date < %@", selectedDate.startDateOfMonth as NSDate, selectedDate.endDateOfMonth as NSDate))
}
var body: some View {
// other code
}
}
Stockez le selectedDatecomme @Statedans le superview et recréez le TransactionsListViewavec la valeur actuelle.
Jana Duggar a été ouverte sur sa recherche de l'amour. Voici tout ce qu'elle a dit sur le sujet et sa fenêtre de mariage de cinq ans.
La star d'Outlander, Sam Heughan, a récemment révélé ce qu'il retirera du tournage pour se souvenir de Jamie Fraser, le rôle qui a fait de lui une star.
"She Loves You" a été écrite en une heure, enregistrée en une journée, et a été la chanson des Beatles avec l'une de leurs meilleures performances de leur carrière.
Dolly Parton et sa grand-mère Bessie avaient une relation spéciale. Grand-mère Parton était très malade, mais cela n'a pas empêché Dolly de lui faire des farces.
Vous pensez peut-être que le chêne ou le noyer sont résistants, mais en matière de bois les plus durs au monde, ils sont loin derrière.
L'océan regorge de beauté, mais il abrite aussi certaines des créatures marines les plus terrifiantes de la planète. Nombre de ces animaux vivent dans les profondeurs obscures et sous haute pression des abysses.
Que vous affrontiez des créatures hostiles ou vous prépariez pour des affrontements PvP, connaître les meilleurs enchantements d'épée dans Minecraft peut vous donner un avantage considérable. Enchanter vos épées vous permet d'infliger plus de dégâts, d'augmenter le butin des créatures et d'accroître leur durabilité.
Quand on parle de pays socialistes, on imagine souvent un contrôle total de l'État et l'absence de propriété privée. Mais en réalité, les économies socialistes sont très diverses.
« Enfants » laisse tomber un caméo de grand nom et des nouvelles dévastatrices
Ce RAV4 est déclaré en excellent état et est prêt pour un jeu de chaises musicales.
Des images de drones ont montré des pompiers semblant lutter pour éteindre l'incendie.
Eyes of Wakanda est directement lié au MCU, ainsi que des mises à jour sur X-Men '97, What If..., Daredevil, et plus encore.
Ava Gardner a été mariée à Mickey Rooney et Frank Sintra, et a fréquenté plusieurs autres stars d'Hollywood. Voici un aperçu de l'histoire amoureuse d'Ava Gardner.
John Cleese a épousé sa femme, Jennifer Wade, en 2012. Voici tout ce qu'il faut savoir sur la femme de John Cleese, Jennifer Wade.
Craig Melvin a épousé la présentatrice sportive Lindsay Czarniak en 2011. Voici tout ce qu'il faut savoir sur la femme de Craig Melvin.
Maggie Gyllenhaal et Peter Sarsgaard se sont mariés en 2009 et partagent deux filles ensemble. Voici une chronologie complète de leur relation.
Ça me frappe tout à coup, comme c'est si souvent le cas C'est à nouveau le milieu du chemin <Non, pas celui du Pacifique, toi marron, celui du carnaval> Chaque gros titre fort… ..
En 2022, avec la sortie de GPT-3, la compétence en écriture semble devenir moins importante. Avec l'IA, les personnes ayant une mauvaise écriture peuvent également générer du personnel de qualité.
Dans le monde rapide et compétitif d'aujourd'hui, la carrière d'une personne joue un rôle important dans la croissance personnelle, la stabilité financière et la satisfaction globale de la vie. Cependant, de nombreuses personnes se retrouvent prises dans un cycle incessant de stagnation et d'insatisfaction, dépérissant progressivement dans leur vie professionnelle.
La semaine dernière, j'ai remarqué un communiqué de presse, envoyé via PressGazette (un site Web d'information britannique). L'article annonçait qu'Acast, la société d'hébergement et de publicité de podcasts de Scandi, dirigerait un consortium d'éditeurs "probablement les plus influents" du podcasting.