ios - 无论选择什么行,SwiftUI 列表视图都会打开相同的 PDF - 也无法删除列表的扩展名
问题描述
我列出了存储在包中的 PDF 数组。但是,无论我选择哪一行,它总是显示列表中的第一项。我不明白为什么会发生这种情况,因为我在pdf[item]
呈现工作表时正在使用它。
我遇到的另一个问题是我似乎无法删除所列文档的扩展名。我已经尝试添加dropLast(4)
,let = pdf
但它似乎没有做任何事情。
注意:(bundleLoc
根据其他选择而变化,但为了解释,我已将其更改为"/Products/PDF"
这是我列出所有 PDF 的地方:
struct ProductTab5View: View {
@State var showingDetail = false
var body: some View {
ScrollView(.vertical){
VStack(alignment: .leading){
let bundleLoc = "/Products/PDF"
let pdf = Bundle.main.urls(forResourcesWithExtension: "pdf", subdirectory: bundleLoc)?
.compactMap { $0.lastPathComponent } ?? []
.dropLast(4)
ForEach(0..<pdf.count, id: \.self) { item in
Button(action: {
self.showingDetail.toggle()
}, label: {
Text(pdf[item])
})
.sheet(isPresented: $showingDetail) {
PDFKitView(pdfName: pdf[item], pdfLocation: bundleLoc)
}
}
}
}
}
}
这是 PDFViewer 结构的一部分:
struct PDFKitView: View {
var pdfName: String
var pdfLocation: String
var body: some View {
PDFViewer(url: Bundle.main.url(forResource: self.pdfName, withExtension: nil, subdirectory: pdfLocation)!)
.ignoresSafeArea(edges:.bottom)
}
}
解决方案
你这里有几个问题。
首先,要删除.pdf
您需要在 上使用的扩展名dropLast(4)
,String
而不是Array
由compactMap
.
其次,您实际上是在为循环.sheet
的每次迭代创建一个ForEach
。所有工作表的可见性都由 控制$showingDetail
,但您只能看到最顶层(第一个)工作表。
我会建议一些改进:
- 存储一个数组
URL
而不是String
- 这样您就不需要URL
在PDFKitView
. - 使用
@State
var 指示URL
应该显示哪个 - 直接遍历数组。没有必要使用
index
struct ProductTab5View: View {
@State var showingDetail = false
@State var pdfURL: URL?
var body: some View {
ScrollView(.vertical){
VStack(alignment: .leading){
let bundleLoc = "/Products/PDF"
let pdfs = Bundle.main.urls(forResourcesWithExtension: "pdf", subdirectory: bundleLoc) ?? []
ForEach(pdfs, id: \.self) { pdf in
Button(action: {
self.pdfURL = pdf
self.showingDetail.toggle()
}, label: {
Text((pdf.lastPathComponent ?? "").dropLast(4))
})
}
.sheet(isPresented: $showingDetail) {
PDFKitView(pdf: self.$pdfURL)
}
}
}
}
}
struct PDFKitView: View {
@Binding var pdf: URL?
var body: some View {
if let url = self.pdf {
PDFViewer(url: url)
.ignoresSafeArea(edges:.bottom)
} else {
Text("PDF Not found")
}
}
}
推荐阅读
- php - 注册后自动记住我
- python - SQLAlchemy:尝试从列中提取不同的值
- sql - SQL 中使用查询的百分比
- java - 使用环境变量的 Spring jndi.xml 放置架
- asp.net-mvc - 如何在选择表格行上的复选框时获取行的 ID 并将 Id 值绑定到 MVC 剃刀视图中的模型
- python - 带有数组输入参数的 Python OPC-UA 调用方法
- sql - 登录程序 SQL 的总时间
- javascript - 如何从其他模块获取数据
- openssl - PyOpenSSL 和 openssl 1.1.1g 的 SSL 握手错误
- django - SMTPAuthenticationError:Django 中的身份验证不成功 [BL1PR13CA0128.namprd13.prod.outlook.com]