2015-10-01 1 views
0

Я создал класс, который реализует NSURLProtocol, который расскажет мне о запросах UIWebView. Я хочу сказать пользовательскому интерфейсу, что мы попали в интересующий URL и запустили код на ViewController для доступа к WebView.iOS Swift как сообщить контроллеру UIView, что мы получили информацию через объект NSURLProtocol

Я считаю, что протоколы - это решение, но, по-видимому, он не обманывает меня, как заставить это работать. Любые предложения и примеры кода будут высоко оценены. Вот что я пробовал до сих пор.

UI Посмотреть Controller.swift

class WebViewController: UIViewController,WebAuthDelegate { 

     @IBOutlet weak var webView: UIWebView! 

     override func viewDidLoad() { 
      super.viewDidLoad() 

       let url = NSURL(string: "http://example.com") 
      let request = NSURLRequest(URL: url!) 
      webView.loadRequest(request) 
     } 

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

     @IBAction func onBackClick(sender: AnyObject) { 
      if(webView.canGoBack){ 
       webView.goBack() 
      } 
     } 
     @IBAction func onFwdClick(sender: AnyObject) { 
      if(webView.canGoForward){ 
       webView.goForward() 
      } 
     } 

     @IBAction func onRefresh(sender: AnyObject) { 
      webView.reload() 
     } 
     func getUserToken() { 
      print("RUN THIS AFTER I HIT URL IN URL PROTOCAL CLASS") 
     } 
    } 

Вот мой NSURLProtocol реализован класс наряду с попыткой протокола (который, пожалуйста, скажите мне, если его неправильный подход)

class CUrlProtocol: NSURLProtocol { 

    //let delegate: WebAuthDelegate? = nil 
    override class func canInitWithRequest(request: NSURLRequest) -> Bool { 

     print("URL = \(request.URL!.absoluteString)") 
     if request.URL!.absoluteString == "http://api-dev.site.com/token" { 
      //Tell the UI That we now have the info and we can access the UIWebView Object 
     } 

     return false 
    } 


} 
protocol WebAuthDelegate{ 
    func getUserToken() 
} 

ответ

0

Лучший способ для достижения это, вероятно, должно было бы отправить NSNotification из вашего протокола, когда вы сопоставляете URL-адрес.

В CUrlProtocol, когда вы нашли (имя уведомления может быть ваш выбор) матч:

let notification:NSNotification = NSNotification(name: "MyURLMatchedNotification", object: nil) 
NSNotificationCenter.defaultCenter().postNotification(notification) 

В вашей WebViewController:

// During init (or viewDidAppear, if you only want to do it while its on screen) 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "getUserToken", name: "MyURLMatchedNotification", object: nil) 

... 

// During dealloc (or viewWillDisappear) 
NSNotificationCenter.defaultCenter().removeObserver(self, name: "MyURLMatchedNotification", object: nil) 

Вы также можете передать что-то с уведомлением, если вы нужна информация из этого запроса. Просто установите параметр object при создании вашего уведомления и измените свой getUserToken, чтобы принять единственный параметр, который имеет тип NSNotification и получить доступ к его object.

Смежные вопросы