【发布时间】:2020-01-03 22:26:11
【问题描述】:
我有一个使用 SwiftUI 构建的相当简单的应用程序,它本质上是一个大师 详细类型。数据存储在核心数据中。添加和更新记录工作正常, 但是从列表视图中删除项目时应用程序总是崩溃。我正在使用 .onDelete 修饰符进行删除。我没有收到任何错误消息 - 只是 断线。记录确实被删除了,所以我猜是重新渲染 的列表视图没有接收到更新的数据。
我可能在做梦,但我很确定删除功能在之前的工作中有效 两个贝塔。该应用程序仅在设备上运行。它在预览版和模拟器中都不起作用。
iOS 13.1、Xcode (11392r)、Catalina (19A546d)
这是 ContentView():
struct ContentView: View {
@Environment(\.managedObjectContext) var managedObjectContext
@FetchRequest(fetchRequest: ToDoItem.getAllToDoItems()) var toDoItems: FetchedResults<ToDoItem>
@State private var newToDoItem = ""
var body: some View {
NavigationView {
List {
Section(header: Text("Records")) {
ForEach(self.toDoItems) { toDoItem in
NavigationLink(destination: EditToDo(toDoItem: toDoItem)) {
ToDoItemView(title: toDoItem.title!,
firstName: toDoItem.firstName!,
lastName: toDoItem.lastName!,
//createdAt: "\(toDoItem.createdAt!)")
createdAt: self.localTimeString(date: toDoItem.createdAt!)
)
}
}
.onDelete { indexSet in
let deleteItem = self.toDoItems[indexSet.first!]
self.managedObjectContext.delete(deleteItem)
do {
try self.managedObjectContext.save()
} catch {
print(error)
}
}
.onMove(perform: move)
}
}
.navigationBarTitle("Customers")
.navigationBarItems(trailing: EditButton())
}
}
func move(from source: IndexSet, to destination: Int) {
print("this is the move method with no actions")
}
func localTimeString(date: Date) -> String {
let formatter = DateFormatter()
formatter.timeZone = .current
formatter.dateFormat = "M-d-yyyy HH:mm:ss"
let returnString = formatter.string(from: date)
return returnString
}//localTimeString
}
还有托管对象:
public class ToDoItem : NSManagedObject, Identifiable {
@NSManaged public var id: UUID
@NSManaged public var createdAt: Date?
@NSManaged public var title: String?
@NSManaged public var firstName: String?
@NSManaged public var lastName: String?
}
extension ToDoItem {
static func getAllToDoItems() -> NSFetchRequest<ToDoItem> {
let request: NSFetchRequest<ToDoItem> = ToDoItem.fetchRequest() as! NSFetchRequest<ToDoItem>
let sortDescriptor = NSSortDescriptor(key: "createdAt", ascending: true)
request.sortDescriptors = [sortDescriptor]
return request
}
}
任何指导将不胜感激。
【问题讨论】:
-
快速思考?将你的闭包代码移动到一个函数中并使用
onDelete调用它。移动代码后,将其 all 注释掉,然后(在可能的情况下)一次重新引入一行。看看你能不能把事情缩小一点。 -
我在上下文保存后的 do 块中有一个打印语句,它总是打印。我在 Section &ForEach 行有断点。我确实在删除后到达了那些,但没有太多关于线程失败原因的信息。它是线程 1,主断点和 AppDelegate 断点表示 exc_breakpoint (code=1,subcode...),我认为这表明试图解开一个可选的,但这不会成为问题,除非 ContentView 在删除。有个想法,可能@FetchRequest 还是有bug。我会尝试在删除后强制重新获取。
-
我有一个在 .onAppear 时间加载的有问题的列表(从外部 SQL DB 驱动)。我经常因为内部表格视图与数据不同步而崩溃。在其他地方阅读,有人建议 Xcode beta 6/7 中的列表存在时间问题。我添加了一个微小的延迟
DispatchQueue.main.asyncAfter(deadline: .now() + 0.01),现在该列表完美运行。 -
有趣。我看不出如何在 SwiftUI 视图中做到这一点?
-
我将延迟放在 SwiftUI 列表视图的 onAppear 闭包中。保存 managedContext 后,您应该可以直接在 onDelete 闭包中执行相同操作 - 当然,假设这是 beta 中的 List 错误,这只是一种解决方法。
标签: ios xcode core-data swiftui macos-catalina