iOS Swift 如何告诉 UIView 控制器我们通过 NSURLProtocol 对象接收到信息

Posted

技术标签:

【中文标题】iOS Swift 如何告诉 UIView 控制器我们通过 NSURLProtocol 对象接收到信息【英文标题】:iOS Swift how to tell the UIView Controller that we received information via a NSURLProtocol object 【发布时间】:2015-10-01 17:18:59 【问题描述】:

我创建了一个实现 NSURLProtocol 的类,它将告诉我有关 UIWebView 请求的信息。我希望告诉 UI 我们点击了感兴趣的 URL 并在 ViewController 上运行代码以访问 WebView。

我相信协议是解决方案,但我似乎无法解决如何让它发挥作用。任何建议和代码示例将不胜感激。这是我到目前为止所尝试的。

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

【问题讨论】:

【参考方案1】:

实现此目的的最佳方法可能是在匹配 URL 时从您的协议中发布 NSNotification

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 属性。

【讨论】:

以上是关于iOS Swift 如何告诉 UIView 控制器我们通过 NSURLProtocol 对象接收到信息的主要内容,如果未能解决你的问题,请参考以下文章

swift : UIView 的平滑翻译与 iOS 控制面板完全一样(跟随用户手指,使用平移)

如何使用动态视图 iOS Swift 处理导航?

Swift - 如何将视图控制器的引用传递给子 UIView 类?

如何使用 segue 从 UIView 导航到 UIView 控制器?

IOS Swift3如何随机删除自定义UIView

如何在 iOS Swift 中将不同的角半径应用于 UIView 的不同角?