<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          KSWebView?基于 WKWebview 進行二次封裝的 WebView

          聯(lián)合創(chuàng)作 · 2023-09-26 17:10

          KSWebView,最好的 WKWebView 繼承者。

          KSWebView是基于WKWebview進行2次封裝的WebView。

          KSWebView具有:

          • 用JS語句的方式調(diào)用原生類/對象,方便快捷,老板提出來的臨時需求也能馬上解決的方式。

          • 無縫JS與原生交互 (原生與JS獲得各自的Return值) (一句語句注冊JS方法調(diào)用回調(diào))

          • 無縫JS與原生數(shù)據(jù)交互 丟棄cookie,數(shù)據(jù)由自己自由的管理,而且與原生互通。

          • 本地數(shù)據(jù)存儲模塊支持KVO,當數(shù)值發(fā)生變化時,注冊了該值的觀察者無論原生還是JS端都可以收到更新回調(diào)

          KSWebView的整體結(jié)構(gòu)如下圖 

          用JS語句的方式調(diào)用原生類/對象

          例如我們想要在JS中執(zhí)行下列OC代碼

          Objective-C:

          UIViewController *vc = [[UIViewController alloc]init];
          [vc setTitle:@"測試標題"];
          
          UIColor *whiteColor = [UIColor whiteColor];
          [[vc view] setBackgroundColor:whiteColor];
          
          [[vc view] setTag:17287];
          
          UINavigationController *nav = [[[UIApplication sharedApplication] keyWindow] rootViewController];
          [nav pushViewController:vc animated:YES];

          JavaScript:

          //先導入要用到的OC類
          var tools = window.OCTools;
          var UIViewController = tools.importClass("UIViewController");
          var UIColor = tools.importClass("UIColor");
          var UIApplication = tools.importClass("UIApplication");
          
          var vc = UIViewController.alloc().init();
          vc.setTitle("測試標題");
          
          var white = UIColor.whiteColor();
          vc.view().setBackgroundColor(white);
          
          vc.view().setTag(17287);
          
          var nav = UIApplication.sharedApplication().keyWindow().rootViewController();
          nav.pushViewControlleranimated(vc, true);
          tools.releaseObjects();//調(diào)用完畢后為了防止內(nèi)存溢出必須釋放

          是不是很簡單?只要先導入要用到的類,然后就和用JS寫一個OC代碼一樣簡單!需要注意的是,調(diào)用多個參數(shù)的方法時需要去掉所有的冒號,然后將參數(shù)一次按順序放入傳參括號內(nèi),就可以了。例如:

          Objective-C:

          UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"提示" message:@"描述信息" delegate:nil cancelButtonTitle:@"關(guān)閉" otherButtonTitles:nil];
          [alert show];

          JavaScript:

          var UIAlertView = window.OCTools.importClass("UIAlertView");
          var alert = UIAlertView.alloc().initWithTitlemessagedelegatecancelButtonTitleotherButtonTitles("提示","描述信息",null,"關(guān)閉",null);
          alert.show();
          window.OCTools.releaseObjects();//調(diào)用完畢后為了防止內(nèi)存溢出必須釋放

          返回值類型

          一切js可以識別的格式都是可以被js直接使用的(例如:string,number 等等).oc對象結(jié)構(gòu)體等變量承接之后只可以當作方法傳的值,因為js無法識別。這是必然,js是無法使用oc對象的。例如:

          Objective-C:

          UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"提示" message:@"描述信息" delegate:nil cancelButtonTitle:@"關(guān)閉" otherButtonTitles:nil];
          [alert setTag:15269];
          [alert setTitle:@"新標題"];
          NSInteger tag = [alert tag];
          NSString *title = [alert title];
          [alert show];

          JavaScript:

          var UIAlertView = window.OCTools.importClass("UIAlertView");
          var alert = UIAlertView.alloc().initWithTitlemessagedelegatecancelButtonTitleotherButtonTitles("提示","描述信息",null,"關(guān)閉",null);
          alert.setTag(15269);
          alert.setTitle("新標題");
          var tag = alert.tag();//返回的number是可以直接使用的
          var title = alert.title();//返回的string是可以直接使用的
          alert.show();
          window.OCTools.releaseObjects();//調(diào)用完畢后為了防止內(nèi)存溢出必須釋放

          Dictionary與Array

          快速的將JS對象轉(zhuǎn)換為NSDictionary或?qū)S數(shù)組轉(zhuǎn)換為NSArray

          Dictionary:

          var data = {
          'key': 'value',
          'anyKey': 'anyValue'
          };
          //將JS對象轉(zhuǎn)換為NSDictionary
          var NSDictionary = window.OCTools.importClass("NSDictionary");
          var dict = NSDictionary.dictionaryWithDictionary(data);
          //將NSDictionary轉(zhuǎn)換為JS對象
          var jsonString = dict.mj_JSONString();
          var jsObject = JSON.parse(jsonString);
          window.OCTools.releaseObjects();//調(diào)用完畢后為了防止內(nèi)存溢出必須釋放

          Array:

          var data = ["NO.1", "NO.2", "NO.3", "NO.4"];
          //將JS對象轉(zhuǎn)換為NSDictionary
          var NSArray = window.OCTools.importClass("NSArray");
          var arr = NSArray.arrayWithArray(data);
          //將NSDictionary轉(zhuǎn)換為JS對象
          var jsonString = arr.mj_JSONString();
          var jsArray = JSON.parse(jsonString);
          window.OCTools.releaseObjects();//調(diào)用完畢后為了防止內(nèi)存溢出必須釋放

          其實本質(zhì)上JS的對象/數(shù)組可以直接當做NSDictionary/NSArray參數(shù)傳遞,上述只是提供了互相轉(zhuǎn)換的方法。

          importClass:  該方法在內(nèi)部已經(jīng)實現(xiàn)了不管你重復import多少次相同的Class都拿到的是相同的一個,所以放心大膽的用,不用擔心,不過最好將其放在界面加載完成后importClass,防止出現(xiàn)問題。

          releaseObjects: 因為內(nèi)部對象都是有引用的所以只有調(diào)用了此方法才會銷毀所有對象,如果長期不銷毀內(nèi)存會越來越大,嚴重就會導致崩潰,所以請盡量在使用完oc調(diào)用后調(diào)用此方法來銷毀所有oc對象。

          關(guān)于無縫JS與原生交互/本地數(shù)據(jù)存儲模塊支持KVO的介紹請查看demo

          瀏覽 23
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          編輯 分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          編輯 分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  超碰97国产福利 | 韩日操逼一级 | 亚洲性爱视频网站 | 国产成人自拍偷拍视频 | 中文无码一区二区三区. |