不能在属性初始化器中使用实例成员“pdfName”;属性初始化程序在“自我”可用之前运行

Posted

技术标签:

【中文标题】不能在属性初始化器中使用实例成员“pdfName”;属性初始化程序在“自我”可用之前运行【英文标题】:Cannot use instance member 'pdfName' within property initializer; property initializers run before 'self' is available 【发布时间】:2020-12-12 00:01:28 【问题描述】:

我正在尝试打开与列表中所选行的名称相匹配的 pdf,但我收到错误 Cannot use instance member 'pdfName' within property initializer; property initializers run before 'self' is available

我尝试初始化在视图之间传递的变量名,但没有运气。我知道这很简单,但我在传递数据时总是感到困惑。

这是第一个视图中的UIButton

@State var showingDetail = false

ForEach(0..<product.applicationNotes.count, id: \.self)  item in
                Button(action: 
                    self.showingDetail.toggle()
                ) 
                    Text(product.applicationNotes[item])
                .sheet(isPresented: $showingDetail) 
                    PDFKitView(pdfName: product.applicationNotes[item])
                

这是我尝试将数据传递到的第二个视图。我在第二行收到错误documentURL:

    var pdfName: String
    var documentURL = Bundle.main.url(forResource: pdfName, withExtension: "pdf")!
    var body: some View PDFViewer(url: documentURL) .ignoresSafeArea(edges:.bottom)   

struct PDFViewer: UIViewRepresentable 
    
    var url: URL
    func makeUIView(context:
        UIViewRepresentableContext<PDFViewer>) -> PDFViewer.UIViewType 
        let pdfView = PDFView()
        pdfView.document = PDFDocument(url: self.url)
        return pdfView
    
    func updateUIView(_ uiView: UIView, context: UIViewRepresentableContext<PDFViewer>) 
    

这是我试图初始化它但不知道我哪里出错了:

 init() 
    self.pdfName = self.documentURL()
 

【问题讨论】:

我认为这个问题有一个简单的答案,但我认为一个最小(或至少“本地完成”)的例子会有所帮助。您发布了一些代码片段,但目前还不清楚(至少对我而言)它们在哪里以及它们之间的关系如何。也许您可以编辑帖子以使示例更易于理解。 【参考方案1】:

几个问题:

    您正在使用其上方的 pdfName 属性初始化 documentURL,这在 SwiftUI 结构中是禁止的。这就是你得到的错误。

    var documentURL = Bundle.main.url(forResource: pdfName, withExtension: "pdf")!

    在 init 方法中,您将一个 URL 属性分配回 pdfName String 属性。

    self.pdfName = self.documentURL()

SwiftUI 已经为 pdfName 属性设置了一个 init,去掉 init 和 documentURL 属性,试试这个:

struct PDFKitView 
    var pdfName: String
    
    var body: some View 
        PDFViewer(url: Bundle.main.url(forResource: self.pdfName, withExtension: "pdf")!)
            .ignoresSafeArea(edges:.bottom)
    

它并不理想,但会让您摆脱尝试使用另一个 Struct 属性的值初始化 Struct 属性的问题。将 .onAppear() 视为设置辅助属性的更好方法。无论如何,我不建议在 init 方法中进行资源获取,onAppear 会是一个更好的地方。

【讨论】:

这太好了,感谢您深入解释我哪里出错了!

以上是关于不能在属性初始化器中使用实例成员“pdfName”;属性初始化程序在“自我”可用之前运行的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI Maps - 不能在属性初始化器中使用实例成员;属性初始化程序在 'self' 可用之前运行

无法在属性初始化程序中使用实例成员,将变量设置为惰性不起作用

不能在属性初始值设定项中使用实例成员 '';属性初始化程序在 'self' 可用之前运行

错误不能在属性初始化程序中使用实例成员“xxx”

SwiftUI CS193P - 不能在属性初始化程序中使用实例成员“卡片”;属性初始化程序在“自我”可用之前运行

结构中的 Swift/SwiftUI 属性初始化程序错误