首页 > 解决方案 > 未修改的 SwiftUI / Core Data 默认应用程序代码不在模拟器中运行?

问题描述

当我在 Xcode (12.3) 中创建并运行一个新的、未修改的 Core Data / SwiftUI 应用程序项目时,模拟器显示一个空白屏幕。代码如下。

创建新的应用项目后,会生成 SwiftUI 代码,其中包括一个列表以及添加编辑按钮。UI 在 Xcode 的预览中正确显示,但在模拟器中显示不正确。

这是ContentView.swift文件中的默认代码:


import SwiftUI
import CoreData

struct ContentView: View {
    @Environment(\.managedObjectContext) private var viewContext

    @FetchRequest(
        sortDescriptors: [NSSortDescriptor(keyPath: \Item.timestamp, ascending: true)],
        animation: .default)
    private var items: FetchedResults<Item>

    var body: some View {
        List {
            ForEach(items) { item in
                Text("Item at \(item.timestamp!, formatter: itemFormatter)")
            }
            .onDelete(perform: deleteItems)
        }
        .toolbar {
            #if os(iOS)
            EditButton()
            #endif

            Button(action: addItem) {
                Label("Add Item", systemImage: "plus")
            }
        }
    }

    private func addItem() {
        withAnimation {
            let newItem = Item(context: viewContext)
            newItem.timestamp = Date()

            do {
                try viewContext.save()
            } catch {
                // Replace this...
                let nsError = error as NSError
                fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
            }
        }
    }

    private func deleteItems(offsets: IndexSet) {
        withAnimation {
            offsets.map { items[$0] }.forEach(viewContext.delete)

            do {
                try viewContext.save()
            } catch {
                // Replace this...
                let nsError = error as NSError
                fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
            }
        }
    }
}

private let itemFormatter: DateFormatter = {
    let formatter = DateFormatter()
    formatter.dateStyle = .short
    formatter.timeStyle = .medium
    return formatter
}()

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView().environment(\.managedObjectContext, PersistenceController.preview.container.viewContext)
    }
}

你可以简单地通过创建一个启用 SwiftUI 和 Core Data 的新 iOS App 项目来重现这一点:

代码

试图把我的头绕在这些东西上。卡在默认代码上是没有希望的!

标签: xcodecore-dataswiftui

解决方案


恕我直言,是的,这似乎是示例的错误,可能值得提交反馈

问题:

  • 由于视图不在导航视图内,因此导航按钮不可见
  • 工具栏修饰符需要使用ToolbarItem缺少的。

概述:

  1. 请将视图内容包装在一个NavigationView
  2. 将工具栏按钮包裹在里面ToolbarItem

解决方案:

替换 body 计算属性如下:

    var body: some View {
        NavigationView {
            List {
                ForEach(items) { item in
                    Text("Item at \(item.timestamp!, formatter: itemFormatter)")
                }
                .onDelete(perform: deleteItems)
            }
            .toolbar {
                
                #if os(iOS)
                ToolbarItem(placement: .navigationBarTrailing) {
                    
                    EditButton()
                }
                #endif
                
                ToolbarItem(placement: .navigationBarLeading) {

                    Button(action: addItem) {
                        Label("Add Item", systemImage: "plus")
                    }
                }
            }
        }
    }

推荐阅读