SwiftUI:在 Preview Provider 中执行函数

Posted

技术标签:

【中文标题】SwiftUI:在 Preview Provider 中执行函数【英文标题】:SwiftUI: Execute functions in Preview Provider 【发布时间】:2020-02-19 08:39:10 【问题描述】:

我想我在处理这个 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?我认为这太复杂了,太快了。

【问题讨论】:

【参考方案1】:

假设getFirstProject 正常工作,以下应该工作

struct ProjectView_Previews: PreviewProvider

    static var previews: some View
    
        ProjectView(project: getFirstProject())
    

但是对于以下内容存在担忧...

struct ProjectView: View

    @State var project: Project //NSManagedObject

因为@State 被设计为仅用于内部视图状态的事物,但在您的情况下Projecta model,因此推荐的方案是通过符合Project 来使用ObservableObject 视图模型或作为独立的线索类持有Project 实例。

【讨论】:

以上是关于SwiftUI:在 Preview Provider 中执行函数的主要内容,如果未能解决你的问题,请参考以下文章

为啥 macOS 中的 SwiftUI 多行换行文本在 Preview 中有效,但在实际应用中无效?

SwiftUI Preview 因链接器错误而失败

SwiftUI项目如何在Xcode预览(Preview)中开启调试支持

SwiftUI项目如何在Xcode预览(Preview)中开启调试支持

Xcode如何利用预览(Preview)让SwiftUI视图快速适配不同尺寸的设备

如何在没有测试目标的情况下让 SwiftUI Preview 只构建主要目标?