? ? ? ?前些時間轻绞,博主遇到了一個需求采记,就是在網(wǎng)頁在UIWebView顯示之前傳參數(shù)給web,就是webView調(diào)用OC代碼的問題政勃。那個寫web頁面的兄弟和博主對這個不是很熟悉唧龄。然后就是各種google,然后用了網(wǎng)上一個WebViewJavascriptBridge-master的庫奸远,然后整個人就開始懵B了既棺。直到一個大神給我一個例子,看到例子以后終于搞定了懒叛,現(xiàn)在記錄下這個過程丸冕。。芍瑞。
web調(diào)OC需要用到JSContext晨仑,這個東西是干嘛的呢?以下是蘋果給出解釋:A JSContextobject represents a JavaScript execution environment. You create and use JavaScript contexts to evaluate JavaScript scripts from Objective-C or Swift code, to access values defined in or calculated in JavaScript, and to make native objects, methods, or functions accessible to JavaScript.我個人的理解就是它是一個web,也就相當于OC里的一個的類吧(不知道理解的對不對)拆檬。
它的創(chuàng)建和使用都很簡單,就像這樣:
我來解釋下為什么要把self給context的iOS呢妥凳?看到下面的代碼你就明白了:
當然竟贯,這只是OC里寫的,下面看看web童鞋要怎么寫逝钥,看下面:
看到了嗎屑那?這里的iOS對象就相當于ViewContrller,只要是這個ViewController遵循的協(xié)議方法艘款,只要OC里實現(xiàn)了持际,webView都可以調(diào)用。
PS:如果在協(xié)議加上@optional關(guān)鍵字哗咆,web是調(diào)用不了這些方法的蜘欲。
以上代碼中,其實有個地方是有問題的晌柬,這個問題也是博主后來才發(fā)現(xiàn)的姥份,問題的點就是:
這就會造成這個self會被強引用郭脂,最終會變成循環(huán)引用。解決是創(chuàng)建一個中間對象:
使用時澈歉,就這樣用:
最后展鸡,這個問題還是沒有完全解決,只是通過中間類替換了埃难,這個中間類會被強引用Sū住!涡尘!樓主忍弛,放棄了這個方法,改用WKWebView悟衩,可以點這里查看新的方案剧罩,如果還是不明白,那就看Demo吧座泳。