2016-03-29 11 views
0

mein webview.URL?.absoluteURL.absoluteString gibt nil zurück. Dies ist ein WKWebview, nicht ein UIWebVIew, so webview.request?.URL?.absoluteString wird dafür nicht funktionieren. Ich habe auch versucht webview.URL?.absoluteString.webview.URL? .absoluteString gibt null zurück

Die URL wird in einer anderen UIViewController-Klasse festgelegt. Das Webview selbst lädt richtig, daher weiß ich, dass .URL nicht gleich Null ist. (Verwendung cmd/ctrl + f '// Problem' Linie zu finden):

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

Die func in einer anderen UIViewController Klasse, die die URL enthält. Die Website in der Webansicht wird ordnungsgemäß geladen.

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 
} 
+0

Wenn Sie das WKNavigationDelegate bereits implementieren, können Sie navigationAction.request.URL in der Methode decidePolicyForNavigationAction überprüfen. –

+0

In welcher Klasse ist das 'init'? – szym

Antwort

1

Sie sollten das AbsoluteString-Attribut der URL verwenden.

webView.URL?.absoluteString 

Die schreibgeschützte URL-Eigenschaft erhält nach dem Aufruf von loadRequest einen Wert. Hier ist ein Beispiel:

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

Dieser druckt die folgenden:

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

wo hast du es genannt? Bitte zeigen Sie uns Ihren Code. Wenn Sie es in didFinishNavigation oder didFailNavigation delegieren, erhalten Sie einen Wert. –

+0

Ich überprüfte Ihren Code und nirgends fand ich den Teil, wo Sie loadRequest Funktion von WKWebView aufrufen. Das ist der Grund, warum du ein Nichts bekommst. –

+0

Haben Sie das WebView dieser Klasse zu dem einer anderen Klasse festgelegt? Aus Ihrem obigen Code scheint es, als würden Sie hier ein neues WebView erstellen. Und das könnte der Grund sein, warum es null ist. –

0

Wahrscheinlich webView.URL? ist gleich Null, weil es nicht gesetzt wurde.

Wenn Sie erwarten, dass es gesetzt wird, stellen Sie sicher, dass der Code-Einstellung tatsächlich vor der Code ausgeführt wird, in dem Sie es lesen möchten.

+0

Ja, aber es hat möglicherweise keinen Wert * zum Zeitpunkt der Überprüfung. * Sind Sie sicher, dass die URL nicht gesetzt wird, nachdem die Ansicht initialisiert wurde? –