我想让这个let动态的传递到item属性中。
如果我把'forResource'改成静态名称,一切都能正常工作。 我只是不能让它成为动态的。
import SwiftUI
struct PdfDetailView: View {
@Binding var item: String
let documentURL = Bundle.main.url(forResource: $item, withExtension: "pdf")!
var body: some View {
VStack(alignment: .leading) {
Text("Pdf view")
.font(.largeTitle)
HStack(alignment: .top) {
Text("PDF Below)
.font(.title)
}
PDFKitView(url: documentURL)
}
}
}
这里是可能的解决方案(当然,假设你在创建之前确保URL是有效的。PdfDetailView
)
struct PdfDetailView: View {
@Binding var item: String
var body: some View {
VStack(alignment: .leading) {
Text("Pdf view")
.font(.largeTitle)
HStack(alignment: .top) {
Text("PDF Below")
.font(.title)
}
PDFKitView(url: Bundle.main.url(forResource: item, withExtension: "pdf")!)
}
}
}
如果项目字符串不能保证有效,这里是可能的替代方案。
struct PdfDetailView: View {
@Binding var item: String
var body: some View {
let documentURL = Bundle.main.url(forResource: item, withExtension: "pdf")
return VStack(alignment: .leading) {
Text("Pdf view")
.font(.largeTitle)
HStack(alignment: .top) {
Text("PDF Below")
.font(.title)
}
if documentURL != nil {
PDFKitView(url: documentURL!)
}
}
}
}
你可以通过它在 init
:
struct PdfDetailView: View {
let documentURL: URL
init(item: String) {
documentURL = Bundle.main.url(forResource: item, withExtension: "pdf")!
// you could handle errors here as well (instead of force unwrapping optionals)
}
...
}
而在其他的View中调用它。
PdfDetailView(item: "someItem")
在其他视图中,你的项目属性可能是动态的(例如: @State
),但它不一定非得是动态的 PdfDetailView
.