swiftui - 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?我认为这太复杂太快了。
解决方案
假设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
实例来使用视图模型。
推荐阅读
- ios - iOS 12.2 上的 PDFKit 崩溃
- angular - 在 Angular 7 中使用 OpenLayers 5 typescript extent.js
- laravel - 如何使用 auth0 在 laravel 中设置不同的身份验证保护
- c++ - 我不断得到预期;错误,我不确定为什么
- web-services - Web 服务客户端生成 - 存根与 Soap 消息
- powerbi - POWER BI 计算列,包含来自不同表的数据和键值
- ansible - 角色覆盖剧本中的任务
- reactjs - 如何从新页面和窗口中的 onclick 事件渲染中获取结果
- python - PyTest:在断言错误中排除模块/插件行号
- python - 我尝试了每一个功能,但它们都不起作用,我希望识别的语音出现在输入框中