【问题标题】:Xcode default Core Data project template has empty List and no Button to add items [duplicate]Xcode默认Core Data项目模板有空列表,没有添加项目的按钮[重复]
【发布时间】:2021-07-25 08:52:11
【问题描述】:

使用 Xcode 12.5(适用于 iOS 14.5)我创建了一个新的 iOS 项目并设置了“核心数据”复选框:

正如您在上面的屏幕截图中看到的,预览画布中的列表已填充。

但是当我在模拟器或真正的 iPhone 11 上运行项目时,列表为空(这是意料之中的)并且没有显示“编辑”或“添加项目”按钮来添加任何新项目.

我没有修改the project,除了尝试其他颜色(以确保丢失的按钮不是黑底黑字)。我还尝试添加一个带有硬编码字符串数组的列表,它起作用了:

这是我的ContentView.swift,为什么没有显示添加或编辑项目的按钮?

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

    @FetchRequest(
        sortDescriptors: [NSSortDescriptor(keyPath: \Item.timestamp, ascending: true)],
        animation: .default)
    private var items: FetchedResults<Item>
    
    private var items2:[String] = (1...200).map { number in "Item \(number)" }

    var body: some View {
        VStack {
            Text("FetchJsonEscapable").foregroundColor(.orange)
            List {
                ForEach(items2, id: \.self) { item in
                    Text("Item  \(item)")
                        .foregroundColor(.green)
                }
/*
                ForEach(items) { item in
                    Text("Item at \(item.timestamp!, formatter: itemFormatter)")
                        .foregroundColor(.blue)
                }
                .onDelete(perform: deleteItems)
 */
            }
            .toolbar {
                EditButton()

                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 {
                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 {
                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
}()

更新:

我已听从 Scott 的建议(谢谢!)并添加了 NavigationView

现在“编辑”按钮可见,但仍然无法添加新项目:

【问题讨论】:

  • 您需要在顶部有一个 NavigationView。 Apple 的代码不附带它,但要查看您需要的工具栏。放在VStack上面
  • 我有added the NavigationView,但“添加项目”按钮仍未显示,请查看我更新的问题。

标签: ios swift xcode core-data swiftui


【解决方案1】:

如果希望将工具栏项添加到 iOS 视图的顶部,除非当前视图是 NavigationView 层次结构的一部分,否则它们不会出现。

如果您要将NavigationView 添加到ContentView 的正文中,您会发现按钮出现:

var body: some View {
  NavigationView {
    // rest of the body
  }
}

【讨论】:

  • 感谢回复,请问您认为是Xcode项目模板的BUG吗?
  • 我有added the NavigationView,但是“添加项目”按钮仍然没有显示,请看我更新的问题。
  • 哦,您可能需要做的另一件事是将每个按钮包装在具有不同 placement 值的 ToolbarItem 中,例如:ToolbarItem(placement: .navigationBarLeading) { EditButton() }
猜你喜欢
  • 1970-01-01
  • 2013-03-11
  • 1970-01-01
  • 2011-10-01
  • 2011-12-31
  • 2010-12-24
  • 1970-01-01
  • 1970-01-01
  • 2018-06-28
相关资源
最近更新 更多