我正在尝试制作一个编辑表单,该表单可以将值作为 @Binding 进行编辑,然后提交更改。在这种情况下,我使用 @FetchRequest 属性包装器填充包含核心数据记录的列表。我想点击一行从列表导航到详细信息视图,然后在详细信息视图上导航到编辑视图。

我尝试在没有 @Binding 的情况下执行此操作,代码将编译,但是当我进行编辑时,它不会反映在之前的屏幕上。似乎我需要使用@Binding,但我无法找到一种方法来在 List 或 ForEach 中获取 NSManagedObject 实例,并将其传递给可以将其用作 @Binding 的视图。
struct TimelineListView: View {
@Environment(\.managedObjectContext) var managedObjectContext
// The Timeline class has an `allTimelinesFetchRequest` function that can be used here
@FetchRequest(fetchRequest: Timeline.allTimelinesFetchRequest()) var timelines: FetchedResults<Timeline>
@State var openAddModalSheet = false
var body: some View {
return NavigationView {
VStack {
List {
Section(header:
Text("Lists")
) {
ForEach(self.timelines) { timeline in
// ?? How to I use the timeline in this list as a …Run Code Online (Sandbox Code Playgroud) 我正在使用核心数据。我有一个名为的字段date,它可以包含日期或零。
我想创建一个名为的第二个字段sortDate,date如果有,它将使用该字段中的日期值。如果该date字段为零,我想返回当前日期。我需要将其作为核心数据属性(而不是计算属性),因为我需要根据此值对获取的记录进行排序。
我认为这样做的方法是使用派生属性,但我找不到有关如何使用它们的任何信息。我选择了名为“派生”的复选框。这显示了“派生表达式”字段,但我不知道在这里输入什么。Xcode UI 上没有指向文档的链接。
尽管有下面的评论,但我找不到有关此功能的任何文档。我已经多次搜索了文档,除了在 WWDC 会议上他们提到文档但没有链接到它来说明如何找到它之外,我找不到Apple 关于此的一个词。
我不是唯一一个没有发现这一点的人:关于核心数据派生属性的文档
我在学习SwiftUI方面取得了进步,但是在将它与Core Data结合使用时却陷入困境。
最近几天,我一直在搜索和阅读关于该主题的所有内容,但是我不知道如何开始解决该问题。
谁能概述在SwiftUI中使用Core Data的基本步骤?
我在Twitter上收到了一些其他反馈,并且一位开发人员建议,SwiftUI列表可能不适合使用带有大型数据集的Core Data。在此处阅读帖子:https : //twitter.com/numist/status/1141012785825845248
这是我将在我的应用程序中采用的方法。
Xcode beta 5具有一些新的Core Data功能。我使用此博客文章中的信息来获取我所需的大部分信息。
我的应用程序中有一个初始视图,需要打开一些模态视图。我正在处理的数据是表单核心数据,我正在使用@FetchedRequest属性包装器填充列表视图。我正在尝试制作的 UI 类似于您在 iOS 13 中的提醒应用程序中创建和编辑列表的方式。
这两个现在都在工作,但存在一些问题。
当我关闭添加模式时,有时我无法点击视图右上角的编辑按钮。点击时什么也不会发生。我尝试附加打印状态声明并且没有被调用。大多数情况下都会发生这种情况,但并非总是如此。
当我使用上述过程编辑记录时,当点击取消或完成关闭此模式时,它将关闭。但在此之后,我无法使用此功能。如果我尝试打开另一个编辑模型,它会打开,但我传递给它的数据永远不会显示在字段中。
我将它们分成两个视图和工作表,因为当我将它们组合成一个视图和工作表时,我遇到了很多问题。
更新:问题 1 已通过将 .sheet 修饰符移到 NavigationView 之外并将它们附加到一些隐藏对象来解决,根据此答案。
至于问题 2,我今晚花了一些时间尝试了一些不同的事情,我想我可以看到问题所在。在初次使用后重新打开编辑模式时,它正在经历任何类型的初始化过程。没有调用初始化,甚至没有调用onAppear()附加到视图。在这种情况下,文本字段使用的 @State 变量永远不会填充记录中的值,因为不会再次调用文本字段代码。我不知道如何处理这个问题。在任何其他环境中,我只会删除该实例并创建一个新实例,但我不知道如何删除由模态创建的 Edit 视图的缓存实例。
更新:截至 2019 年 8 月 27 日,iOS 13.1 修复了第二个问题。我什至不必重新编译即可查看修复程序。
更新以将工作表移到 NavigationView 之外
import SwiftUI
struct TimelineListView: View {
@Environment(\.managedObjectContext) var managedObjectContext
@FetchRequest(fetchRequest: Timeline.allTimelinesFetchRequest()) var timelines: FetchedResults<Timeline>
@State var listViewEditMode: EditMode = .inactive
@State var openModalSheetAdd = …Run Code Online (Sandbox Code Playgroud) 是否可以在 SwiftUI 的 @FetchRequest 属性包装器内的谓词中使用核心数据记录?
我有一个项目列表和一个任务列表。我想点击一个项目并导航到该项目的相关任务列表。我似乎无法找到一种在初始化 @FetcheRequest之前以 SwiftUI可以看到的方式传入父项目的方法。
我尝试将父项目放在 EnvironmentObject 中。当我从 ProjectListView 导航到 TaskListView 时会调用它。
TaskListView()
.environment(\.managedObjectContext, self.managedObjectContext)
.environmentObject(self.projectToEdit)
Run Code Online (Sandbox Code Playgroud)
然后在我添加的 TaskListView 中尝试了这个:
@Environment(\.managedObjectContext) var managedObjectContext
@EnvironmentObject var parentProject: Project
@FetchRequest(
entity: Task.entity(),
sortDescriptors: [
NSSortDescriptor(keyPath: \Task.name, ascending: true)
],
predicate: NSPredicate(format: String(format: "%@%@", "taskProject", " == %@"), parentProject)
) var tasks: FetchedResults<Task>
Run Code Online (Sandbox Code Playgroud)
我在谓词的行上收到以下错误。
不能在属性初始值设定项中使用实例成员“parentProject”;属性初始值设定项在 'self' 可用之前运行
那么有没有办法以某种方式编写一个可以使用父项目的谓词?将项目传递给任务视图似乎行不通。我还能如何在这样的谓词中使用记录?
在 SwiftUI 中,有没有办法让系统字体的圆形版本成为所有样式的默认值?我正在为应用程序中的所有文本使用一种系统样式(.body、.title、.headline 等)。
例如,我可以在单个文本视图上使用它
Text("some text")
.font(.system(.body, design: .rounded))
Run Code Online (Sandbox Code Playgroud)
我想避免像这样更新我的应用程序中的每个文本视图和字段。有没有办法告诉环境默认使用圆形设计?
我的应用程序具有简单的导航需求
我具有此设置并可以在iPhone上使用,但是当我在iPad上以纵向模式运行该应用程序时,主列表始终处于隐藏状态。
我在.isDetailLink(false)从第一个列表到第二个列表的导航链接上使用,因此两个列表始终位于主列中。在iPad横向模式中,所有功能均按预期工作,但在纵向模式中,详细信息视图将填充屏幕。我可以从屏幕左侧轻扫以显示列表,但我想向用户提供更多的清晰度。
我想显示或添加“后退”按钮以显示主/列表侧(类似于Apple Notes应用)。在iPhone上,默认情况下会显示“后退”按钮,但在纵向模式下的iPad上,它什么都没有。
struct ParentList: View {
let firstList = ["Sample data 01", "Sample data 02", "Sample data 03", "Sample data 04", "Sample data 05"]
var body: some View {
NavigationView {
List{
ForEach(firstList, id: \.self) { item in
NavigationLink(destination: ChildList()){
Text(item)
}
.isDetailLink(false)
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
struct ChildList: View {
let secondList = ["More Sample data 01", "More Sample data 02", "More Sample data …Run Code Online (Sandbox Code Playgroud) 我想使用EditButton()切换编辑模式,并将列表行切换到编辑模式。我想在编辑模式下包括一个新按钮以打开模式。我什至无法获得EditMode值来切换行内容。
struct ContentView: View {
@Environment(\.editMode) var isEditMode
var sampleData = ["Hello", "This is a row", "So is this"]
var body: some View {
NavigationView {
List(sampleData, id: \.self) { rowValue in
if (self.isEditMode?.value == .active) {
Text("now is edit mode") // this is never displayed
} else {
Text(rowValue)
}
}
.navigationBarTitle(Text("Edit A Table?"), displayMode: .inline)
.navigationBarItems(trailing:
EditButton()
)
}
}
}
Run Code Online (Sandbox Code Playgroud) 如何检查设备上的暗模式是否已启用。我想从视图中检查它并有条件地显示或隐藏阴影。
我以为我可以从环境中获取 colorScheme 但我想我错过了一些东西。
struct FloatingAddButton : View {
@Environment(\.colorScheme) var colorScheme
@Binding var openAddModal: Bool
var body : some View {
VStack {
Spacer()
HStack() {
Spacer()
Button(action: {
self.openAddModal = true
}) {
ZStack {
Circle()
.foregroundColor(Color(RetroTheme.shared.appMainTint))
.frame(width: 50, height: 50, alignment: .center)
if(self.colorScheme == .light) {
.shadow(color: .secondary, radius: 5, x: 0, y: 0)
}
Image(systemName: "plus")
.foregroundColor(Color.white)
}
} // End Button
}
}
}
}
Run Code Online (Sandbox Code Playgroud)