SwiftUI: выполнение функций в провайдере предварительного просмотра - PullRequest
0 голосов
/ 19 февраля 2020

Я думаю, что с этим SwiftUI все в порядке. Понятно, что мы просто определяем макет как структуру, и может быть ограничено обычное программирование, вовлеченное в макет. У меня трудности с таким мышлением. Каков наилучший способ сделать это?

Возьмите пример ниже. Проект является NSManagedObject. Все, что я хочу сделать, это передать пример записи, чтобы SwiftUI отображал. Ничего из того, что я пробую, не работает.

struct ProjectView: View
{
    @State var project: Project //NSManagedObject

     var body: some View 
     {
         TextField("", text: Binding<String>($project.projectName)!)
     }
}

struct ProjectView_Previews: PreviewProvider
{
    static var previews: some View
    {
        var p:Project

        p = getFirstProject() //returns a Project

        return ProjectView(project: p)
    }
}

Если я пытаюсь вернуть структуру, она говорит, что не может просмотреть в файле.

Если я не возвращаю структуру, я получаю, что Функция объявляет непрозрачный возвращаемый тип, но в его теле нет операторов возврата, из которых можно вывести основную ошибку типа.

ОБНОВЛЕНИЕ:

var app = UIApplication.shared.delegate as! AppDelegate

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {



lazy var persistentContainer: NSPersistentCloudKitContainer = {
                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
        })
        return container
    }()

    lazy var managedObjectContext: NSManagedObjectContext =
    {
         return persistentContainer.viewContext
    }()
}

И остальная часть кода:

func allRecords<T: NSManagedObject>(_ type : T.Type, sort: NSSortDescriptor? = nil) -> [T]
{
    let context = app.managedObjectContext
    let request = T.fetchRequest()
    if let sortDescriptor = sort
    {
        request.sortDescriptors = [sortDescriptor]
    }

    do
    {
        let results = try context.fetch(request)
        return results as! [T]
    }
    catch
    {
        print("Error with request: \(error)")
        return []
    }
}

func getCount() -> String
{
    let r = allRecords(Project.self)

    return String(r.count)

}
struct ProjectView: View
{
//    @ObservedObject var project: Project

     var body: some View
     {
        Text(getCount())

//           TextField("", text: Binding<String>($project.projectName)!)
      }
}

struct ProjectView_Previews: PreviewProvider
{
    static var previews: some View
    {
        ProjectView()
    }
}

r.count возвращает 0, но в главном потоке приложения он возвращает 8. Правильно ли определен app.managedObjectContext? Я думаю, что это слишком усложнилось слишком быстро.

1 Ответ

0 голосов
/ 19 февраля 2020

Если предположить, что getFirstProject работает правильно, должно работать следующее

struct ProjectView_Previews: PreviewProvider
{
    static var previews: some View
    {
        ProjectView(project: getFirstProject())
    }
}

Однако существуют опасения по поводу следующего ...

struct ProjectView: View
{
    @State var project: Project //NSManagedObject

, поскольку @State предназначен для внутреннего использования. просматривать только состояние, но Project в вашем случае - a model, поэтому рекомендуемый сценарий для этого - использовать ObservableObject модель представления либо в соответствии с Project, либо в качестве автономного класса подсказки, содержащего Project экземпляр (ы) ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...