iOS中的UIWebView的混合编程

2016-07-08  本文已影响200人  海绵宝宝不要哭

1:基于为何要使用UIWebView来开发,页面的都具有以下共同特点

a:排版复杂。通常包括图片和文字的混排,还有可能有链接需要支持点击。如果不用UIWebView,自己用原生控件通过拼接来实现,由于界面元素太多,做起来会很困难,而如果用CoreText来实现,就需要自己视线相当多的复杂拍版逻辑 。

b:界面的变法需求频繁,列如淘宝的彩票页面,可能常常需要更新界面以推出不同的活动,采用UIWebView实现后,这类页面就可以动态的更新而不用向AppStore提交新的版本,而原生实现的界面很难达到如此的灵活性。

c:界面对用户的交互需求不复杂,因为UIWebView实现的交互效果与原生的效果相比还是会大打折扣,所以这类界面通畅都没有复杂的交互效果,这也是主流应用大多采用混合UIWebView来实现应用界面而不是使用纯UIWebView来实现界面的原因。

2:使用模版引擎来渲染HTML界面

在实际开发中,UIWebView控件接受一个HTML内容,用于呈现相应的界面,下面是API的接口:

- (void)loadHTMLString:(NSString *)string baseURL:(NSURL *)baseURL;

由于HTML内容通常是变法的,所以我们需要在内存中生成该HTML内容。比较简单粗暴的做法是将该HTML的几本内容定义在一个NSString中,然后用objc [NSString stringWithFormat]的方法将内容进行格式化,下面是一个实列:

-(NSString *)demoFormatWithName:(NSString *)name valur:(NSString *)value{
    
    NSString *html =
    @"<HTML>"
    "<HEAD>"
    "</HEAD>"
    "<BODY>"
    "<H1>%@</H1>"
    "<P>%@</P>"
    "</BODY>"
    "</HTML>";
    
    NSString *content = [NSString stringWithFormat:html,name,value];
    return content;
}

但其实我们看出,这样写并不舒服,因为:

1:模块内容和代码混在一起,既不方便阅读,也不方便更改
2:模版的渲染逻辑使用简单的objc [NSString stringWithFormat]来完成,功能单一。在实际开发中,我们很可能需要将原始数据进行二次处理,而这些如果模版渲染模块不能支持,我们就只能自己手工写这部分的数据二次处理,耗时耗力,例如:微博的详情界面,如果微博的发送时间小于一天,则需要显示成“xxx小时前”,如果小于1分钟,则需要显示成“刚刚”。这些界面渲染方法的逻辑如果能够抽取到专门的排版代码中,就能清晰很多。

所以我们需要一个模版引擎,专门复杂这类的渲染的工作,我个人使用过的模版MGTemplateEngine(https://github.com/mattgemmell/MGTemplateEngine),它的模版语言比较像Smarty,FreeMarket和Django。另外它可以自己定义Filter,以便实现上面提到的自定义渲染逻辑,他需要依赖 RegexKit, RegexKit是一个正则表达式工具类,提供强大的正则表达式工具类,提供强大的正则表达式匹配的替换功能。
不喜欢模版引擎功能太过于复杂的朋友,也可以尝试GRMustache(https://github.com/groue/GRMustache),它比MGTemplateEngine,GRMustache的功能更简单,另外GRMustache在开源社区更加活跃,更新更频繁。
对于上面的示咧代码,在使用GRMustache模版后,我们首先需要调整模版的内容:
1:将模版内容放在另一个单独的文件中,方便日后更改。
2:将原来的%@,替换{{ name }}的形式。
模版调整后变成以下内容(文件名为template.html):


<HTML>

还没有结束……

上一篇下一篇

猜你喜欢

热点阅读