xcode - 未修改的 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 项目来重现这一点:
试图把我的头绕在这些东西上。卡在默认代码上是没有希望的!
解决方案
恕我直言,是的,这似乎是示例的错误,可能值得提交反馈
问题:
- 由于视图不在导航视图内,因此导航按钮不可见
- 工具栏修饰符需要使用
ToolbarItem
缺少的。
概述:
- 请将视图内容包装在一个
NavigationView
- 将工具栏按钮包裹在里面
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")
}
}
}
}
}
推荐阅读
- c# - HTTP 错误 500.31 - 无法加载 ASP.NET Core 运行时
- python - Python列出文件/目录而不更新上次访问时间?
- java - 如何在 JSP 中加载图像
- python - 使用 datetime timedelta 函数
- python - Python如何在函数中使用指针
- android - onTap 事件中的数据颤动
- ldap - 如何在 Quarkus 中使用 LDAP 验证/授权用户
- angular - TypeScript 编译中缺少 ts 文件
- javascript - 我正在尝试创建一个切换按钮来打开或关闭一个人的可用性状态并更新数据库中的当前状态
- qt - QML 地图缓存存储在 ubuntu/windows 哪里?