एक SwiftUI बीनने की जगह के लिए एक FetchedResults का उपयोग करने के लिए सबसे अच्छा अभ्यास

Nov 25 2020

मैं वर्तमान में साथ काम कर रहा हूँ CoreData FetchedResultsऔर SwiftUIs PickerView। ऐसा करते समय मुझे एक समस्या का सामना करना पड़ा जब एक PickerView को पॉप्युलेट करने के लिए FetchedResults का उपयोग किया जाता है:

मैं स्पष्ट रूप से PickerView को पॉप्युलेट करने के लिए FetchedResults का उपयोग कर सकता हूं लेकिन चयनित परिणाम के लिए @State को परिभाषित करने के लिए कौन सा समाधान सबसे अच्छा है (UI / UX परिप्रेक्ष्य से)?

@FetchRequest(sortDescriptors: [NSSortDescriptor(keyPath: \User.lastName, ascending: true)], animation: .default) private var users: FetchedResults<User>
@State var user: User = User()

// ...

Picker(selection: $user, label: Text("User")) {
    ForEach(users) { user in
        Text(lastName).tag(user)
    }
}

यह काम करता है, हालांकि इसे डिफ़ॉल्ट के रूप में सेट करने के लिए एक नया खाली उपयोगकर्ता ऑब्जेक्ट बनाने का शायद सबसे सुरुचिपूर्ण तरीका नहीं है

क्या आप में से किसी को भी इस समस्या को हल करने के लिए एक बेहतर विचार / सर्वोत्तम अभ्यास है?

जवाब

2 davidev Nov 25 2020 at 17:14

यदि आप हर समय एक डमी उपयोगकर्ता () नहीं बनाना चाहते हैं, जो आपके बताए अनुसार अच्छा अभ्यास नहीं है, तो आपको अपने FetchRequest को अपने में करना होगा init()या किसी अन्य दृश्य में अपना FetchedResult पास करना होगा।

यहाँ एक और दृश्य के साथ एक समाधान है

struct ContentView : View {
    
    @FetchRequest(sortDescriptors: [NSSortDescriptor(keyPath: \User.lastName, ascending: true)], animation: .default) private var users: FetchedResults<User>

    var body : some View {
        PickerView(users: Array(users))
    }
}

struct PickerView : View {

    var users : [User]
    @State var selectedUser : User?
    
    init(users: [User]) {
        self.users = users
        self._selectedUser = State(initialValue: users.first)
    }
    
    var body : some View {
        Picker(selection: $selectedUser, label: Text("Users")) {
            ForEach(users) { user in
                Text(user.lastName ?? "").tag(user as User?)
            }
        }

    }
}

संपादित करें:

वास्तव में आप केवल अपने व्यक्ति को वैकल्पिक घोषित कर सकते हैं। इसलिए आपको एक डिफ़ॉल्ट प्रदान करने की आवश्यकता नहीं है। जब यह ला रहा है तो यह स्वचालित रूप से पहले आइटम को पिकर में ले जाएगा। यदि आप एक अलग तरीके से चयन करना चाहते हैं तो आप उस विधि का उपयोग कर सकते हैं। Init में FetchRequest के बारे में () ने कुछ महीने पहले यहां एक उत्तर पोस्ट किया था