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
被设计为仅用于内部视图状态的事物,但在您的情况下Project
是a model
,因此推荐的方案是通过符合Project
来使用ObservableObject
视图模型或作为独立的线索类持有Project
实例。
【讨论】:
以上是关于SwiftUI:在 Preview Provider 中执行函数的主要内容,如果未能解决你的问题,请参考以下文章
为啥 macOS 中的 SwiftUI 多行换行文本在 Preview 中有效,但在实际应用中无效?
SwiftUI项目如何在Xcode预览(Preview)中开启调试支持
SwiftUI项目如何在Xcode预览(Preview)中开启调试支持