小编rad*_*dev的帖子

SwiftUI - 将 @Binding 与核心数据 NSManagedObject 一起使用?

我正在尝试制作一个编辑表单,该表单可以将值作为 @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)

core-data swiftui

19
推荐指数
2
解决办法
4293
查看次数

如何在 Core Data 中使用派生属性

我正在使用核心数据。我有一个名为的字段date,它可以包含日期或零。

我想创建一个名为的第二个字段sortDatedate如果有,它将使用该字段中的日期值。如果该date字段为零,我想返回当前日期。我需要将其作为核心数据属性(而不是计算属性),因为我需要根据此值对获取的记录进行排序。

我认为这样做的方法是使用派生属性,但我找不到有关如何使用它们的任何信息。我选择了名为“派生”的复选框。这显示了“派生表达式”字段,但我不知道在这里输入什么。Xcode UI 上没有指向文档的链接。

尽管有下面的评论,但我找不到有关此功能的任何文档。我已经多次搜索了文档,除了在 WWDC 会议上他们提到文档但没有链接到它来说明如何找到它之外,我找不到Apple 关于此的一个词。

我不是唯一一个没有发现这一点的人:关于核心数据派生属性的文档

core-data ios swift

11
推荐指数
1
解决办法
2234
查看次数

在SwiftUI中使用核心数据

我在学习SwiftUI方面取得了进步,但是在将它与Core Data结合使用时却陷入困境。

  • 模型对象-我制作了几个具有所需属性和关系的实体
  • ??? 我不知道从哪里开始。如何让SwiftUI与Core Data对话?
  • SwiftUI-我有一些基本的布局在工作,并显示一些临时类的数据,但是这些对核心数据不了解

最近几天,我一直在搜索和阅读关于该主题的所有内容,但是我不知道如何开始解决该问题。

谁能概述在SwiftUI中使用Core Data的基本步骤?

更新:

我在Twitter上收到了一些其他反馈,并且一位开发人员建议,SwiftUI列表可能不适合使用带有大型数据集的Core Data。在此处阅读帖子:https : //twitter.com/numist/status/1141012785825845248

这是我将在我的应用程序中采用的方法。

  • 列表视图:
    • UITableViewController(带有FetchedResultsController)
    • 管理与核心数据存储的连接
    • 使用依赖注入将记录传递到详细信息视图
  • 详细/编辑视图:
    • 尽可能使用UIHostingController构建这些对象
    • 使用SwiftUI表单制作简单的数据输入表单
    • 通过依赖注入接收数据
    • 将数据复制到临时的BindableObject类型
      • 使本地UI机会获得临时记录
      • 退出时将临时数据保存回实际记录

更新2-2019.08.14

Xcode beta 5具有一些新的Core Data功能。我使用此博客文章中的信息来获取我所需的大部分信息。

core-data ios swiftui

6
推荐指数
1
解决办法
2665
查看次数

工作表修饰符的 SwiftUI 问题

我的应用程序中有一个初始视图,需要打开一些模态视图。我正在处理的数据是表单核心数据,我正在使用@FetchedRequest属性包装器填充列表视图。我正在尝试制作的 UI 类似于您在 iOS 13 中的提醒应用程序中创建和编辑列表的方式。

  • 添加记录 - 允许用户随时创建新列表(子对象稍后)。
  • 编辑记录 - 将列表视图切换到编辑模式,点击一行上的编辑按钮打开一个模式来编辑记录。

这两个现在都工作,但存在一些问题。

  1. 当我关闭添加模式时,有时我无法点击视图右上角的编辑按钮。点击时什么也不会发生。我尝试附加打印状态声明并且没有被调用。大多数情况下都会发生这种情况,但并非总是如此。

  2. 当我使用上述过程编辑记录时,当点击取消或完成关闭此模式时,它将关闭。但在此之后,我无法使用此功能。如果我尝试打开另一个编辑模型,它会打开,但我传递给它的数据永远不会显示在字段中。

我将它们分成两个视图和工作表,因为当我将它们组合成一个视图和工作表时,我遇到了很多问题。

更新:问题 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

6
推荐指数
1
解决办法
7928
查看次数

SwiftUI 和核心数据 - 如何在谓词中使用父记录?

是否可以在 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' 可用之前运行

那么有没有办法以某种方式编写一个可以使用父项目的谓词?将项目传递给任务视图似乎行不通。我还能如何在这样的谓词中使用记录?

core-data swiftui

5
推荐指数
1
解决办法
1019
查看次数

将系统设置为始终使用圆形字体?

在 SwiftUI 中,有没有办法让系统字体的圆形版本成为所有样式的默认值?我正在为应用程序中的所有文本使用一种系统样式(.body、.title、.headline 等)。

例如,我可以在单个文本视图上使用它

Text("some text")
    .font(.system(.body, design: .rounded))
Run Code Online (Sandbox Code Playgroud)

我想避免像这样更新我的应用程序中的每个文本视图和字段。有没有办法告诉环境默认使用圆形设计?

swiftui

5
推荐指数
1
解决办法
1053
查看次数

iPad上的SwiftUI导航-如何显示主列表

我的应用程序具有简单的导航需求

  • 列表视图(父对象)
  • 列表视图(子对象)
  • 详细视图(子对象)

我具有此设置并可以在iPhone上使用,但是当我在iPad上以纵向模式运行该应用程序时,主列表始终处于隐藏状态。

我在.isDetailLink(false)从第一个列表到第二个列表的导航链接上使用,因此两个列表始终位于主列中。在iPad横向模式中,所有功能均按预期工作,但在纵向模式中,详细信息视图将填充屏幕。我可以从屏幕左侧轻扫以显示列表,但我想向用户提供更多的清晰度。

我想显示或添加“后退”按钮以显示主/列表侧(类似于Apple Notes应用)。在iPhone上,默认情况下会显示“后退”按钮,但在纵向模式下的iPad上,它什么都没有。

这就是我在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)

swift swiftui

3
推荐指数
2
解决办法
709
查看次数

SwiftUI-如何在列表中进行编辑行?

我想使用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)

swiftui swiftui-list

2
推荐指数
2
解决办法
744
查看次数

SwiftUI - 如何检查是否启用了暗模式?

如何检查设备上的暗模式是否已启用。我想从视图中检查它并有条件地显示或隐藏阴影。

我以为我可以从环境中获取 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)

swiftui

1
推荐指数
1
解决办法
1464
查看次数

标签 统计

swiftui ×8

core-data ×4

ios ×2

swift ×2

swiftui-list ×1