Trevir
Trevir

Reputation: 73

webview.URL?.absoluteString returning nil

my webview.URL?.absoluteURL.absoluteString is returning nil. This is a WKWebview, not a UIWebVIew, so webview.request?.URL?.absoluteString will not work for this. I have also tried webview.URL?.absoluteString.

The URL is set in another UIViewController class. The webview itself loads properly, so I know .URL is not nil. (use cmd/ctrl+f '//Problem' to find line):

override init(frame: CGRect) {
    super.init(frame: frame)
    gestureRecognizers = [UIPanGestureRecognizer(target:self, action:"moveWindow:")]
    //Change aspects of our view (width, height, color, etc)
    header.frame.size.width=frame.size.width
    header.frame.size.height=45
    header.layer.cornerRadius = 4
    //addSubview(header)
    windowMask.frame=frame
    stackButton.frame=frame
    windowMask.layer.cornerRadius = 6
    windowMask.clipsToBounds=true

    layer.shadowColor = UIColor.blackColor().CGColor
    layer.shadowOpacity = 1
    layer.shadowRadius = 5
    layer.shadowOffset = CGSizeMake(0, 1);
    layer.cornerRadius = 6
    backgroundColor = UIColor(patternImage: UIImage(named: "Window Texture.png")!)
    //opaque=false
    //backgroundColor = UIColor.clearColor()
    addSubview(windowMask)
    dragArea.frame.size.width=frame.size.width-120
    dragArea.frame.origin.x=40
    dragArea.frame.origin.x=40
    //addSubview(dragArea)
    //Our webview for... well, isn't it obvious?
    webview.frame = CGRectMake(0, 40, frame.width, frame.height-40)
    webview.allowsBackForwardNavigationGestures=true
    windowMask.frame=CGRectMake(0, 0, frame.width, frame.height)
    windowMask.addSubview(webview)
    //The back button
    bbutton.setImage(UIImage(named: "Back"), forState: .Normal)
    bbutton.frame = CGRectMake(5, 5, 30, 30)
    windowMask.addSubview(bbutton)
    bbutton.addTarget(self, action: "bbuttonPressed:", forControlEvents: .TouchUpInside)
    //The large button to select a window in the Stack menu
    stackButton.addTarget(self, action: "stackSelected:", forControlEvents: .TouchUpInside)
    //The resize button for making the window fullscreen
    rbutton.setImage(UIImage(named: "Max"), forState: .Normal)
    rbutton.frame = CGRectMake(frame.width-60, 7, 25, 25)
    windowMask.addSubview(rbutton)
    rbutton.addTarget(self, action: "rbuttonPressed:", forControlEvents: .TouchUpInside)
    //The X button for closing a window
    xbutton.frame = CGRectMake(frame.width-35, 5, 30, 30)
    xbutton.setImage(UIImage(named: "Close"), forState: .Normal)
    windowMask.addSubview(xbutton)
    xbutton.addTarget(self, action: "xbuttonPressed:", forControlEvents: .TouchUpInside)
    //The button for adjusting window size
    abutton.frame = CGRectMake(frame.width-20, frame.height-20, 20, 20)
    abutton.setImage(UIImage(named: "Resize"), forState: .Normal)
    windowMask.addSubview(abutton)
    abutton.addTarget(self, action: "abuttonDragged:", forControlEvents: .TouchDown)
    //The task button
    taskButton.frame.size=CGSizeMake(60,60)
    taskButton.backgroundColor=UIColor.whiteColor()
    taskButton.frame.origin=CGPointMake(CGFloat(system.windows.count)*60,60)
    taskButton.addTarget(self, action: "taskSelected:", forControlEvents: .TouchDown)
    //Problem here:
    let imgURL = NSURL(string: "http://google.com/s2/favicons?domain="+(self.webview.URL?.absoluteString)!)
    print(self.webview.URL?.absoluteURL.absoluteString)
    let imageRequest: NSURLRequest = NSURLRequest(URL: imgURL!)
    NSURLConnection.sendAsynchronousRequest(
        imageRequest, queue: NSOperationQueue.mainQueue(),
        completionHandler: {(response: NSURLResponse?,data: NSData?,error: NSError?) -> Void in
            if error == nil {
                self.taskButton.setImage(UIImage(data: data!),forState: .Normal)
            }
    })
    UIView.animateWithDuration(0.2, animations: {
        self.frame.origin.y=50
        self.taskButton.frame.origin.y=0
    })
}

The func in another UIViewController class that sets the URL. Site in web view itself loads properly.

func addWindowButtonPressed(sender: UIButton!) {
    let url = NSURL(string: "https://google.com")
    let request = NSURLRequest(URL: url!)
    let newView = Window(frame: CGRectMake(self.view.frame.size.width/2-200,self.view.frame.size.height, 400, 300))
    if !system.stacked {
        view.addSubview(newView)
        newView.webview.loadRequest(request)
        system.windows.append(newView)
        taskView.addSubview(newView.taskButton)
        newView.windowID=system.windows.count
        taskView.contentSize.width=CGFloat(system.windows.count)*60
    }
    taskView.contentSize.width=CGFloat(system.windows.count)*60
}

Upvotes: 1

Views: 3217

Answers (2)

Christian Abella
Christian Abella

Reputation: 5797

You should use the absoluteString attribute of URL.

webView.URL?.absoluteString

the URL read-only property will get a value after you call loadRequest. Here is a sample:

func loadWebPage(url : NSURL!)
{
  let urlbefore = webView.URL?.absoluteString
  print (urlbefore)

  let theRequest = NSMutableURLRequest(URL:url, cachePolicy:NSURLRequestCachePolicy.ReturnCacheDataElseLoad, timeoutInterval:15.0)
  self.webView.loadRequest(theRequest)

  let urlafter = webView.URL?.absoluteString
  print (urlafter)     
}

This will print the following:

nil
Optional("https://www.google.com/")

Upvotes: 1

szym
szym

Reputation: 5846

Most likely webView.URL? is nil because it was not set.

If you expect it to be set, make sure that the code setting it is actually executed before the code in which you want to read it.

Upvotes: 0

Related Questions