如何使用从核心数据中提取的数据深度链接小部件?

时间:2021-04-09 20:13:22

标签: ios xcode swiftui ios14 widgetkit

我正在尝试让深层链接适用于我的应用小部件。这些小部件仅显示来自 Core Data 实体:Project 的图像。我希望当用户点击小部件时,它会打开图像所属的 ProjectDetailView()。 我读到的所有内容都说我应该能够添加 Link(destination: url) 但我没有得到任何结果。在我的应用程序中,project 是从 Core Data 中提取的,但它没有 url 属性。根据我看到的例子,我觉得它不需要一个?

下面的代码给了我错误 Value of type 'FetchedResults<Project>' has no member 'url' 这是真的..它没有。我不明白如何获取包含图像的 ProjectDetailView() 的网址。非常感谢您的观看!

struct SimpleEntry: TimelineEntry {
    let date: Date
    
}

struct WidgetEntryView : View {
    
    var entry: Provider.Entry
    @State var projectImage1: Data = .init(count: 0)
    @FetchRequest(entity: Project.entity(), sortDescriptors: []) var project: FetchedResults<Project>
    
    var body: some View {
        
        if let randomProject: Project = project.randomElement() {
            Link (destination: project.url) {
            Image(uiImage: UIImage(data: randomProject.image1 ?? self.projectImage1) ?? UIImage(imageLiteralResourceName: "icon"))
                .resizable()
                .aspectRatio(contentMode: .fill)
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

如果您查看其 CharacterDetail.swift 中的网址,它类似于 "game:///spouty" game 来表示应用程序的 :///conform to url 以及一些独特的东西。

所以你需要为你的文件获取一个 URL 是遵循相同的模式。

yourApp:///anyUniqueVariable

您可以使用计算变量在对象 extensionclass 中实现这一点。

extension Project{
    var url: URL{
       return URL(string: "yourApp:///\(self.anyUniqueVariable)")
    }
}

您一直说您有一个并不真正相关的 CoreData 对象,因为实际连接是通过 SwiftUI 建立的,以及您如何“触发”您的 NavigationLink 到显示您的对象的 View

如果您查看 ContentView.swift,您会看到

        .onOpenURL(perform: { (url) in
            self.pandaActive = url == CharacterDetail.panda.url
            self.spoutyActive = url == CharacterDetail.spouty.url
            self.eggheadActive = url == CharacterDetail.egghead.url
        })

他们将 NavigationLink initisActive 一起使用,并在“收到的 url == 字符 url”时触发使其成为 true

您可以使用该方法(可能不是最好的,因为您可能有超过 3 个对象)或带有 initNavigationLink 具有 selection 并设置 {{1} }/tag 变量到您在 selection 中收到的 url

这取决于您想如何触发 openURL

相关问题