2016-04-07 10 views
4

Ich versuche, eine Zurück-Schaltfläche für meine iOS WKWebView App so zu erstellen, wenn der Benutzer auf die Schaltfläche klickt, die sie zur vorherigen WKWebView-Seite führt. Ich habe zahlreiche Tutorials dazu gefunden, wie man das mit IB macht, aber nicht mit direktem Code. Das ist, was ich habe, so weit:iOS - Wie WKWebView Zurück Button programmgesteuert erstellen?

Original-ViewController.swift:

import UIKit 
import WebKit 

class ViewController: UIViewController, WKNavigationDelegate { 

    private var webView: WKWebView! 

    let wv = WKWebView(frame: UIScreen.mainScreen().bounds) //needed for working webview 

    self.webView = WKWebView(frame: frame) 
    self.webView.navigationDelegate = self 

    func rightbutton(text: String, action: Selector) { 
     let rightButton = UIBarButtonItem(title: text, style: .Plain, target: self, action: action) 
     self.navigationItem.rightBarButtonItem = rightButton 
    } 

    func action() { 
     if self.webView.canGoBack { 
      print ("Can go back") 
      self.webView.goBack() 
      self.webView.reload() 

     } else { 
      print ("Can't go back") 
     } 
    } 


    override func viewDidLoad() { 
     super.viewDidLoad() 
     guard let url = NSURL(string: "http://communionchapelefca.org/app-home") else { return } 
     wv.navigationDelegate = self 
     wv.loadRequest(NSURLRequest(URL: url)) 
     view.addSubview(wv) 


     webView.goBack() 
     webView.reload() 



     prefButton() 
     //backButton() 

     NSNotificationCenter.defaultCenter().addObserver(self, 
      selector: "receiveNotification:", 
      name: "BeaconServiceRegionEnter", 
      object: nil) 

     NSNotificationCenter.defaultCenter().addObserver(self, 
      selector: "receiveNotification:", 
      name: "BeaconServiceRegionUpdate", 
      object: nil) 

     NSNotificationCenter.defaultCenter().addObserver(self, 
      selector: "receiveNotification:", 
      name: "BeaconServiceRegionExit", 
      object: nil) 

    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func prefButton() { 
     let image = UIImage(named: "icon-pref128") as UIImage? 
     let button = UIButton(type: UIButtonType.Custom) as UIButton 
     let screenSize: CGRect = UIScreen.mainScreen().bounds 
     let screenWidth = screenSize.width 
     let screenHeight = screenSize.height 

     button.frame = CGRectMake(screenWidth * 0.85, screenHeight * 0.90, 56, 56) // (X, Y, Height, Width) 
     button.setImage(image, forState: .Normal) 
     button.addTarget(self, action: "buttonClicked:", forControlEvents:.TouchUpInside) 
     self.view.addSubview(button) 
    } 

    func buttonClicked(sender:UIButton) 
    { 
     UIApplication.sharedApplication().openURL(NSURL(string: UIApplicationOpenSettingsURLString)!) 
    } 

    func receiveNotification(notification: NSNotification) { 
     print(notification.userInfo) 
    } 

    func webView(webView: WKWebView, decidePolicyForNavigationAction navigationAction: WKNavigationAction, decisionHandler: (WKNavigationActionPolicy) -> Void) { 
     if navigationAction.navigationType == .LinkActivated { 
      if let newURL = navigationAction.request.URL, 
       host = newURL.host where !host.containsString("communionchapelefca.org") && 
        UIApplication.sharedApplication().canOpenURL(newURL) { 
         if UIApplication.sharedApplication().openURL(newURL) { 
          print(newURL) 
          print("Redirected to browser. No need to open it locally") 
          decisionHandler(.Cancel) 
         } else { 
          print("browser can not url. allow it to open locally") 
          decisionHandler(.Allow) 
         } 
      } else { 
       print("Open it locally") 
       decisionHandler(.Allow) 
      } 
     } else { 
      print("not a user click") 
      decisionHandler(.Allow) 
     } 
    } 

} 

Irgendwelche Vorschläge? Danke im Voraus.

BEARBEITEN: angefügt gesamte ViewController statt Code-Schnipsel.

EDIT2: Antwort von k8mil war nahe, da seine Antwort nicht die ursprüngliche URL geladen hat. Unten ist die einzige Einstellung seiner Antwort:

private func createWebView() { 
     guard let url = NSURL(string: "http://communionchapelefca.org/app-home") else { return } 
     let frame = UIScreen.mainScreen().bounds // or different frame created using CGRectMake(x,y,width,height) 
     self.webView = WKWebView(frame: frame) 
     self.webView.navigationDelegate = self 
     self.webView.loadRequest(NSURLRequest(URL: url)) 
     self.view.addSubview(self.webView) 
    } 

Antwort

6

Try webView.goBack() Methode auf Ihrer WKWebView Instanz anrufen statt WKWebView.goBack(). Auch nach goBack() können Sie eine webView.reload() Methode aufrufen, um sicherzustellen, dass Sie auf der richtigen Seite sind.

ich bearbeitet Ihren Code ein bisschen

import UIKit 
import WebKit 

class ViewController: UIViewController, WKNavigationDelegate { 

private var webView: WKWebView! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    guard let url = NSURL(string: "http://communionchapelefca.org/app-home") else { 
     return 
    } 

    //create WebView and Back button 
    createWebView() 
    backButton() 


    prefButton() 


    NSNotificationCenter.defaultCenter().addObserver(self, 
      selector: "receiveNotification:", 
      name: "BeaconServiceRegionEnter", 
      object: nil) 

    NSNotificationCenter.defaultCenter().addObserver(self, 
      selector: "receiveNotification:", 
      name: "BeaconServiceRegionUpdate", 
      object: nil) 

    NSNotificationCenter.defaultCenter().addObserver(self, 
      selector: "receiveNotification:", 
      name: "BeaconServiceRegionExit", 
      object: nil) 

} 


private func createWebView() { 
    let frame = UIScreen.mainScreen().bounds // or different frame created using CGRectMake(x,y,width,height) 
    self.webView = WKWebView(frame: frame) 
    self.webView.navigationDelegate = self 
    self.view.addSubview(self.webView) 
} 

func addBackButton(text: String, action: Selector) { 
    //this function will add Button on your navigation bar e 

    let rightButton = UIBarButtonItem(title: text, style: .Plain, target: self, action: action) 
    self.navigationItem.rightBarButtonItem = rightButton 
} 


override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

func prefButton() { 
    let image = UIImage(named: "icon-pref128") as UIImage? 
    let button = UIButton(type: UIButtonType.Custom) as UIButton 
    let screenSize: CGRect = UIScreen.mainScreen().bounds 
    let screenWidth = screenSize.width 
    let screenHeight = screenSize.height 

    button.frame = CGRectMake(screenWidth * 0.85, screenHeight * 0.90, 56, 56) // (X, Y, Height, Width) 
    button.setImage(image, forState: .Normal) 
    button.addTarget(self, action: "buttonClicked:", forControlEvents: .TouchUpInside) 
    self.view.addSubview(button) 
} 

func backButton() { 
    let image = UIImage(named: "icon-back") as UIImage? 
    let button = UIButton(type: UIButtonType.Custom) as UIButton 
    let screenSize: CGRect = UIScreen.mainScreen().bounds 
    let screenWidth = screenSize.width 
    let screenHeight = screenSize.height 

    button.frame = CGRectMake(screenWidth * 0.85, screenHeight * 0.90, 56, 56) // (X, Y, Height, Width) 
    button.setImage(image, forState: .Normal) 
    button.addTarget(self, action: "customGoBack:", forControlEvents: .TouchUpInside) 
    self.view.addSubview(button) 
} 

func customGoBack(sender: UIButton) { 
    if self.webView.canGoBack { 
     print("Can go back") 
     self.webView.goBack() 
     self.webView.reload() 
    } else { 
     print("Can't go back") 
    } 
} 

func buttonClicked(sender: UIButton) { 
    UIApplication.sharedApplication().openURL(NSURL(string: UIApplicationOpenSettingsURLString)!) 
} 

func receiveNotification(notification: NSNotification) { 
    print(notification.userInfo) 
} 

func webView(webView: WKWebView, decidePolicyForNavigationAction navigationAction: WKNavigationAction, decisionHandler: (WKNavigationActionPolicy) -> Void) { 
    if navigationAction.navigationType == .LinkActivated { 
     if let newURL = navigationAction.request.URL, 
     host = newURL.host where !host.containsString("communionchapelefca.org") && 
       UIApplication.sharedApplication().canOpenURL(newURL) { 
      if UIApplication.sharedApplication().openURL(newURL) { 
       print(newURL) 
       print("Redirected to browser. No need to open it locally") 
       decisionHandler(.Cancel) 
      } else { 
       print("browser can not url. allow it to open locally") 
       decisionHandler(.Allow) 
      } 
     } else { 
      print("Open it locally") 
      decisionHandler(.Allow) 
     } 
    } else { 
     print("not a user click") 
     decisionHandler(.Allow) 
    } 
} 

} 

Auch Sie keine andere Instanz von WKWebView neeed, weil Sie zuvor in deklariert haben:

es

private var webView : WKWebView!

so ist nicht notwendig:

wv.navigationDelegate = self 
wv.loadRequest(NSURLRequest(URL: url)) 
view.addSubview(wv) 

Für mich funktioniert es.

Hoffnung das wird Ihnen helfen :)

+0

Ich glaube, ich Ihren Vorschlag zu meinen Code korrekt hinzugefügt, aber ich erhalte eine „Expected Erklärung“ an der 'self.webView = WKWebView (Rahmen: frame)' Linie. Gedanken? –

+0

Überprüfen Sie die bearbeitete Antwort, und lassen Sie mich wissen, wenn es funktioniert;) – kamwysoc

+0

Ihre Antwort war in der Nähe, aber ich musste den Webview-Teil überarbeiten, weil die ursprüngliche Website nicht geladen wurde. Ich habe die leicht korrigierte Version in das OP gestellt. Vielen Dank für deine Hilfe! –