Saya memiliki ObservableObject yang dinyatakan seperti ini di DateView saya :
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
}
Saya dapat mengakses startDateOfMonth dan endDateOfMonth di tampilan lain seperti ini:
Text("\(self.selectedDate.startDateOfMonth)")
Tetapi saya memiliki masalah ketika saya mencoba menggunakan variabel-variabel tersebut dari ObservableObject di dalam inisialisasi fetchRequest di TransactionsListView saya :
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
}
}
Saya mendapatkan kesalahan:
Variabel 'self.fetchRequest' digunakan sebelum diinisialisasi
Apa yang saya lakukan salah? Saya telah mencoba menggunakan variabel tersebut di dalam init tanpa self. Kesalahan yang sama. Satu-satunya cara kerjanya adalah jika startDateOfMonth dan endDateOfMonth tidak ada di ObservableObject, tetapi sebagai vars dalam tampilan leluhur yang saya teruskan sebagai parameter ke tampilan saya dengan fetchRequest init. Tetapi saya memiliki beberapa tampilan seperti ini dan ingin menggunakan ObservableObject, tidak meneruskan parameter yang sama ke subview sepanjang waktu.
Masalahnya adalah Anda tidak dapat menggunakan @EnvironmentObjectfile init(). Opsi yang memungkinkan di sini adalah meneruskan EnvironmentObjectparameter as ke View. Kemudian gunakan parameter itu di dalam init. Berikut adalah konstruktor untuk tampilan tersebut, maka Anda dapat mengakses start dan endTime dengan variabel lokal 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))
}
Saat Anda memanggil tampilan itu, teruskan EnvironmentObjectsebagai parameter.
//Declared as Environment Object
TransactionsListView(selectedDate : self.selectedDate)
Swift menjamin semua properti diinisialisasi setelah init.
Ketika Anda mengakses properti objek, diasumsikan bahwa objek sudah diinisialisasi, yang tidak terjadi ketika Anda mengaksesnya di tengah init.
Apa yang terjadi adalah ketika Anda menginisialisasi fetchRequest, Anda mengakses self.selectedDate(sama dengan compiler apakah Anda menambahkan self atau tidak), yang menunjukkan bahwa self diinisialisasi, yang menyiratkan bahwa fetchRequest, sebagai salah satu properti self, siap digunakan. Karenanya kesalahan kompiler:
Variabel 'self.fetchRequest' digunakan sebelum diinisialisasi
Membuat fetchRequestproperti computed atau lazy bekerja. (tidak terlalu paham @FetchRequest)
Semoga ini membantu.
Anda dapat meneruskannya sebagai param ke View:
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
}
}
Simpan selectedDateas @Statedi superview dan buat ulang TransactionsListViewdengan nilai saat ini.
Jana Duggar terbuka tentang pencarian cintanya. Inilah semua yang dia katakan tentang topik dan jendela lima tahun untuk menikah.
Bintang 'Outlander' Sam Heughan baru-baru ini mengungkapkan apa yang akan dia ambil dari lokasi syuting untuk mengingat Jamie Fraser, peran yang membuatnya menjadi bintang.
'She Loves You' ditulis dalam satu jam, direkam dalam sehari, dan merupakan lagu The Beatles dengan salah satu penampilan terbaik dalam karir mereka.
Dolly Parton dan Nenek Bessie memiliki hubungan khusus. Nenek Parton sakit parah, tapi itu tidak menghentikan Dolly untuk mengerjainya.
Anda mungkin mengira kayu ek atau hickory kuat, tetapi jika berbicara tentang kayu terkeras di dunia, keduanya tidak ada yang mendekati.
Lautan memang penuh keindahan, tetapi juga menyembunyikan beberapa makhluk laut paling menakutkan di planet ini. Banyak dari hewan ini bersembunyi jauh di bawah permukaan laut, di dunia laut dalam yang gelap dan bertekanan tinggi.
Jika Anda sedang melawan monster musuh atau bersiap untuk skenario PvP, mengetahui pesona pedang terbaik di Minecraft dapat memberi Anda keuntungan besar. Memikat pedang memungkinkan Anda menghasilkan lebih banyak kerusakan, meningkatkan jumlah monster yang dijatuhkan, dan memperpanjang daya tahan pedang Anda.
Ketika orang berbicara tentang negara sosialis, mereka sering membayangkan kendali penuh pemerintah dan tanpa kepemilikan swasta. Namun dalam praktiknya, ekonomi sosialis sangat bervariasi.
“Children” merilis cameo dengan nama besar dan beberapa berita buruk
RAV4 ini diklaim dalam kondisi sangat baik dan siap digunakan untuk permainan kursi musik.
Rekaman drone memperlihatkan petugas pemadam kebakaran yang tampak kesulitan memadamkan api.
Eyes of Wakanda terhubung langsung dengan MCU, ditambah pembaruan tentang X-Men '97, What If..., Daredevil, dan banyak lagi.
'Laguna Beach' mengikuti kehidupan siswa sekolah menengah Lauren Conrad, Kristin Cavallari, Stephen Colletti, dan banyak lagi pada pertengahan tahun 2000-an. Berikut ini adalah tempat tinggal para pemeran serial realitas MTV tersebut sekarang.
Ava Gardner pernah menikah dengan Mickey Rooney dan Frank Sintra, dan ia pernah berpacaran dengan beberapa bintang Hollywood lainnya. Berikut ini kilas balik riwayat berpacaran Ava Gardner.
John Cleese menikahi istrinya, Jennifer Wade, pada tahun 2012. Berikut semua yang perlu Anda ketahui tentang istri John Cleese, Jennifer Wade.
Berikut semua yang perlu Anda ketahui tentang Francie Frane, mantan peternak yang menikah dengan Dog the Bounty Hunter.
Itu mengejutkan saya Tiba-tiba seperti yang sering terjadi Ini di tengah jalan lagi <Tidak, bukan yang di pasifik Anda merah marun, yang di karnaval> Setiap berita utama keras…..
Di tahun 2022, dengan dirilisnya GPT-3, kemampuan menulis sepertinya menjadi kurang penting. Dengan AI, orang dengan tulisan yang buruk juga dapat menghasilkan staf yang berkualitas.
Di dunia yang serba cepat dan kompetitif saat ini, karier seseorang memainkan peran penting dalam pertumbuhan pribadi, stabilitas keuangan, dan kepuasan hidup secara keseluruhan. Namun, banyak orang menemukan diri mereka terjebak dalam siklus stagnasi dan ketidakpuasan tanpa henti, secara bertahap menyia-nyiakan kehidupan profesional mereka.
Minggu lalu saya melihat siaran pers, dikirim melalui PressGazette (situs web berita media Inggris). Artikel tersebut mengumumkan bahwa Acast, perusahaan hosting dan periklanan podcast Scandi, akan memimpin konsorsium penerbit "mungkin yang paling berpengaruh" dalam podcasting.