我认为我要解决所有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?我认为这太过复杂了。
答案 0 :(得分:0)
假设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
实例的独立线索类来查看模型。