将SwiftUi的值放入一个let语句中

问题描述 投票:-1回答:2

我想让这个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)


            }
    }
}
dynamic binding swiftui
2个回答
0
投票

这里是可能的解决方案(当然,假设你在创建之前确保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!)
            }
        }
    }
}

0
投票

你可以通过它在 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.

© www.soinside.com 2019 - 2024. All rights reserved.