首页 > 解决方案 > SwiftUI:在 Preview Provider 中执行函数

问题描述

我想我在处理这个 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)
    }
}

如果我尝试返回结构,它说它无法在文件中预览。

如果我不返回结构,我会得到一个 Function 声明一个不透明的返回类型,但它的主体中没有返回语句来推断基础类型错误。

更新:

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?我认为这太复杂太快了。

标签: swiftui

解决方案


假设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实例来使用视图模型。


推荐阅读