Результаты основных данных отображаются в окне выбора SwiftUI без предварительного выбора опции

0

Вопрос

Я извлекаю данные из основных данных и отображаю их в окне выбора, это представление встроено в SwiftUI. Сначала я изо всех сил пытался заставить выбор работать с помощью средства выбора, но обнаружил, что, если я предварительно выберу первый объект из результата выборки в начале представления, выбор средства выбора сработает.

Что я хочу, так это иметь возможность загружать свои данные в средство выбора, но не выбирать предварительно один из объектов. Опять же, если я обновлю приведенный ниже код, чтобы ничего не было выбрано заранее, я ничего не смогу выбрать. Я добираюсь до экрана опций, но когда я нажимаю на одну из них, ничего не происходит, я просто получаю эту маленькую вспышку в строке. Мне нужно нажать кнопку "Назад", чтобы вернуться к просмотру формы.

Есть какие-нибудь идеи о том, как заставить работать загрузку основных данных в средство выбора без предварительного выбора одного из вариантов?

-Спасибо!

import SwiftUI
import CoreData

struct RecordCreateview: View {
    @FetchRequest private var actions: FetchedResults<Actions>
    @State private var selectedAction: Actions

    init(context: NSManagedObjectContext) {
        let fetchRequest: NSFetchRequest<Actions> = Actions.fetchRequest()
        fetchRequest.sortDescriptors = [NSSortDescriptor(keyPath: \Actions.action, ascending: true)]
        fetchRequest.predicate = NSPredicate(value: true)
        self._actions = FetchRequest(fetchRequest: fetchRequest)
        do {
            let fetchResult = try context.fetch(fetchRequest)
            self._selectedAction = State(initialValue: fetchResult[0])
        } catch {
            fatalError("Problem fetching Action records.")
        }
    }
    
    var body: some View {
        NavigationView {
            Form {
                Picker("Select action", selection: $selectedAction){
                    ForEach(actions) { action in
                        if action.title == true {
                            Text("\(action.action!)").tag(action)
                        }
                    }
                }
            }
        }
    }
}
core-data ios picker swiftui
2021-10-26 20:12:53
1

Лучший ответ

1

Вы можете установить выбранное действие на несуществующее Actions в init(...) подобный этому:

self._selectedAction = State(initialValue: Actions(context: context))

это не приведет к установке предварительно выбранного объекта в средстве выбора.

struct RecordCreateview: View {
    @FetchRequest private var actions: FetchedResults<Actions>
    @State private var selectedAction: Actions

    init(context: NSManagedObjectContext) {
        let fetchRequest: NSFetchRequest<Actions> = Actions.fetchRequest()
        fetchRequest.sortDescriptors = [NSSortDescriptor(keyPath: \Actions.action, ascending: true)]
        fetchRequest.predicate = NSPredicate(value: true)
        self._actions = FetchRequest(fetchRequest: fetchRequest)
        self._selectedAction = State(initialValue: Actions(context: context))  // <--- here
    }
    
    var body: some View {
        NavigationView {
            Form {
                Picker("Select action", selection: $selectedAction){
                    ForEach(actions) { action in
                        if action.title == true {
                            Text("\(action.action!)").tag(action)
                        }
                    }
                }
            }
        }
    }
}
2021-10-28 22:58:51

Разве это не будет просто создавать новый объект каждый раз?
lorem ipsum

да, это создаст новый Actions каждый раз, но это не спасет его, если вы специально не захотите его сохранить. Вы можете проверить это, добавив .onAppear{ print("---> actions: \(actions.count)") }
workingdog

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................