-1

This is a web browser i'm building for macOS and I'm trying to access a string variable inside my content view. But i'm getting this error

Cannot use instance member 'site' within property initializer; property initializers run before 'self' is available

defining webView inside the body works but my refresh page function in the button stops working.

struct ContentView: View {
    @State private var site: String = "www.google.com/"
    let webView = WebView(request: URLRequest(url: URL(string:"https://" + site)!))
     
    
    
    var body: some View {
     
      TextField("Enter a URL", text: $site) //This is the address bar
        
        NavigationView{
          //  let webView = WebView(request: URLRequest(url: URL(string: "https://" + site )!))
                   
        webView
            .frame(width: 860, height: 860, alignment: .center)
            
        Button(action: {
            self.webView.refresh()
            }) {
                Text("Refresh Page")
            }
        }
    }
}

WebView

import SwiftUI
import WebKit
import AppKit

struct WebView: NSViewRepresentable {
    let request: URLRequest
    private var webView: WKWebView?
    
    init (request: URLRequest) {
        self.webView = WKWebView()
        self.request = request
    }
        
    
    func makeNSView(context: Context) -> WKWebView {
        return webView!
    }
 
    
    
    func refresh(){
       webView?.reload()
       
    }
    
    
    func updateNSView(_ nsView: WKWebView, context: Context) {
        nsView.load(request)
    }
    
    
}
Eric
  • 673
  • 1
  • 7
  • 23
  • Does this answer your question? [How to initialize properties that depend on each other](https://stackoverflow.com/questions/25854300/how-to-initialize-properties-that-depend-on-each-other) or https://stackoverflow.com/questions/62728511/swiftui-cannot-use-instance-member-numberofdevice-within-property-initializer or https://stackoverflow.com/questions/43550813/property-initializers-run-before-self-is-available – Joakim Danielson May 13 '21 at 05:44

1 Answers1

1

Use computed property.

var webView: WebView {
        return WebView(request: URLRequest(url: URL(string:"https://" + self.site)!))
}
Raja Kishan
  • 16,767
  • 2
  • 26
  • 52