【问题标题】:SwiftUi value into a let statementSwiftUi 值转换为 let 语句
【发布时间】:2020-06-09 16:37:01
【问题描述】:

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


    【解决方案1】:

    这是可能的解决方案(当然假设您在创建 PdfDetailView 之前确保 URL 有效)

    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!)
                }
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      你可以通过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)
          }
          ...
      }
      

      在其他一些视图中这样称呼它:

      PdfDetailView(item: "someItem")
      

      在其他视图中,您的项目属性可能是动态的(例如@State),但在PdfDetailView 中它不一定是动态的。

      【讨论】:

        猜你喜欢
        • 2016-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-20
        • 2022-01-01
        相关资源
        最近更新 更多