我正在尝试让深层链接适用于我的应用小部件。这些小部件仅显示来自 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)
}
}
}
}
答案 0 :(得分:0)
如果您查看其 CharacterDetail.swift
中的网址,它类似于 "game:///spouty"
game
来表示应用程序的 :///
到 conform to url 以及一些独特的东西。
所以你需要为你的文件获取一个 URL 是遵循相同的模式。
yourApp:///anyUniqueVariable
您可以使用计算变量在对象 extension
的 class
中实现这一点。
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
init
与 isActive
一起使用,并在“收到的 url == 字符 url”时触发使其成为 true
。
您可以使用该方法(可能不是最好的,因为您可能有超过 3 个对象)或带有 init
的 NavigationLink
具有 selection
并设置 {{1} }/tag
变量到您在 selection
中收到的 url
。
这取决于您想如何触发 openURL
。