热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MakeanTWaverHTML5iPhoneApp

构建iOSApp有很多技术方式可以选择,本文介绍基于UIWebView的CocoaTouch组件嵌入HTML页面的方式实现的一个iPhoneApp例子。文中将穿插iOS的基本内容,TWaverHTML5的基础应用,以及ObjectiveC与Javascript相互调用的技术点。首先通过XCode构建个EmptyApplication即可创建一个UIV

构建iOS App有很多技术方式可以选择,本文介绍基于UIWebView的Cocoa Touch组件嵌入HTML页面的方式实现的一个iPhone App例子。文中将穿插iOS的基本内容,TWaver HTML5的基础应用,以及Objective C与Javascript相互调用的技术点。
Make an TWaver HTML5 iPhone App


Make an TWaver HTML5 iPhone App


Make an TWaver HTML5 iPhone App


Make an TWaver HTML5 iPhone App


Make an TWaver HTML5 iPhone App

首先通过XCode构建个Empty Application即可


Make an TWaver HTML5 iPhone App


Make an TWaver HTML5 iPhone App

创建一个UIViewController子类我命名为MainViewController,然后再xib可视化拖拽出如下界面,其中包含一个UISwitch开关,一个UISlider拉条,一个UITextField输入框,以及一个最重要的UIWebView组件。

 

该例子中UISwitch用于自动布局的开关,UISlider作为network拓朴图的缩放控制,UITextField作为图元label的编辑更新,UIWebView用于加载TWaver HTML5的拓扑组件


Make an TWaver HTML5 iPhone App


Make an TWaver HTML5 iPhone App
 

 
接下来将twaver.js和demo.html的页面内容drag添加进入项目,形成如下目录结构的工程。这里细心的同学以及发现这行代码,这个例子我希望让拓扑自己控制缩放,所以关闭了浏览器的scalable功能并设定了宽度,更多的viewport知识可以参考这里
 

Make an TWaver HTML5 iPhone App
 


Make an TWaver HTML5 iPhone App
 

这时需要我们做个设置,XCode默认将js作为Source而不是Resource处理,所以会导致找不到js资源的问题,可以在XCode的Build Phases里面将twaver.js从Compile Sources干掉,在Copy Bundle Resources里面加入twaver.js
 

Make an TWaver HTML5 iPhone App
 


Make an TWaver HTML5 iPhone App

以下代码在界面呈现时通过UIWebView的loadRequest函数加载指向demo.html的NSURLRequest,注意其中对textfield的添加的个空函数是为了回车能取消编辑,最后的becomeFirstResponder是为了能接收到Shake手势,该例子中通过选中图元摇晃手机可以弹出编辑告警界面。

 

 

Js代码  Make an TWaver HTML5 iPhone App
  1. -(void)viewDidAppear:(BOOL)animated  
  2. {  
  3. [self.webView setDelegate:self];  
  4. [self.webView setScalesPageToFit: YES];  
  5. NSURL *url = [[NSBundle mainBundle] URLForResource:@"demo" withExtension:@"html"];  
  6. NSURLRequest *req = [[NSURLRequest alloc]initWithURL:url];  
  7. [self.webView loadRequest:req];  
  8.   
  9. [self.textField addTarget:nil action:@selector(dummy:)  
  10. forControlEvents:UIControlEventEditingDidEndOnExit];  
  11.   
  12. [self becomeFirstResponder];  
  13. }  

 

以下是Switch开关控制html页面内Javascript代码,Objective C调用Javascript比较容易,直接调用stringByEvaluatingJavascriptFromString运行即可

 

 

Js代码  Make an TWaver HTML5 iPhone App
  1. - (IBAction)handleSwitchChange:(id)sender {  
  2.     if(self.switcher.on){  
  3.         [self.webView stringByEvaluatingJavascriptFromString: @"window.springLayouter.start();"];  
  4.     }else{  
  5.         [self.webView stringByEvaluatingJavascriptFromString: @"window.springLayouter.stop();"];  
  6.     }  
  7. }  

 如果Javascript函数有返回值,则即是stringByEvaluatingJavascriptFromString函数的返回值,以下代码就是通过这种方式来获取network当前的zoom值,以及当前选中图元的名字信息

 

 

Js代码  Make an TWaver HTML5 iPhone App
  1. -(void) updateSlider{  
  2.     NSString* zoom = [self.webView stringByEvaluatingJavascriptFromString: @"window.network.getZoom();"];  
  3.     self.slider.value = [zoom floatValue];  
  4. }  
  5. -(void) updateTextField{  
  6.     NSString* name = [self.webView stringByEvaluatingJavascriptFromString: @"window.getCurrentName();"];  
  7.     self.textField.text = name;  
  8. }  

 

Javascript没有直接调用Objective C的函数,我们只能通过改变页面location的方式,在UIWebView的UIWebViewDelegate中拦截shouldStartLoadWithRequest函数回调来实现Javascript主动调用Objective C代码。实际还不是那么完美,建议读下这篇文章,我现在才有的也是文章建议的再建立一个iFrame方式去改变location避免一些副作用,以下是相关的代码,逻辑很简单我就不解释了。

 

Js代码  Make an TWaver HTML5 iPhone App
  1. - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{  
  2.     NSString* url = [[request URL] absoluteString];  
  3.     if([url hasPrefix:@"call:" ]){  
  4.         NSArray *array = [url componentsSeparatedByString:@":"];  
  5.         NSString *method = [array objectAtIndex:1];  
  6.         [self performSelector:NSSelectorFromString(method)];  
  7.         return NO;  
  8.     }  
  9.     return YES;  
  10. }  

 

 

Js代码  Make an TWaver HTML5 iPhone App
  1. var iframe = document.createElement("IFRAME");  
  2.   
  3. network.addPropertyChangeListener(function(e){  
  4.     if(e.property === 'zoom'){  
  5.         iframe.setAttribute("src""call:updateSlider");  
  6.         document.body.appendChild(iframe);  
  7.         iframe.parentNode.removeChild(iframe);  
  8.     }  
  9. });                   
  10.   
  11. box.getSelectionModel().addSelectionChangeListener(function(e){  
  12.     iframe.setAttribute("src""call:updateTextField");  
  13.     document.body.appendChild(iframe);  
  14.     iframe.parentNode.removeChild(iframe);  
  15. });  

 

 

最后为了让跟随我四年多的已无法升级到iOS5的itouch继续发挥余热,还得做如下一些设置才能用于调试测试,首先Summary里面的Deployment Target需要设置到4.*的版本,plist文件中删除Required device capabilities这行设置,最后在Architectures内改成armv7和armv6

 


Make an TWaver HTML5 iPhone App


Make an TWaver HTML5 iPhone App

 

 

 

最后是两个比较重要的obc和js代码文件供大家参考TWaver HTML5 Demo

 

最后将程序Archive归档发布到了App Store等着Apple的“审判”,如果顺利的话过几天大家就可以在App Store上通过查找到“TWaver”关键字,下载玩玩这篇文章的App,最后当然是free的App了。

 


Make an TWaver HTML5 iPhone App


Make an TWaver HTML5 iPhone App

 

 

 


推荐阅读
  • 网址:https:vue.docschina.orgv2guideforms.html表单input绑定基础用法可以通过使用v-model指令,在 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • iOS Swift中如何实现自动登录?
    本文介绍了在iOS Swift中如何实现自动登录的方法,包括使用故事板、SWRevealViewController等技术,以及解决用户注销后重新登录自动跳转到主页的问题。 ... [详细]
  • 本文介绍了iOS开发中检测和解决内存泄漏的方法,包括静态分析、使用instruments检查内存泄漏以及代码测试等。同时还介绍了最能挣钱的行业,包括互联网行业、娱乐行业、教育行业、智能行业和老年服务行业,并提供了选行业的技巧。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 本文讨论了如何在不使用SearchBar display controller的情况下,单独使用SearchBar并捕获其textChange事件。作者介绍了实际状况,即左侧SliderMenu中的SearchBar需要在主页TableView中显示搜索结果。然后,作者提供了解决方案和步骤,帮助读者实现这一功能。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • 本文介绍了MVP架构模式及其在国庆技术博客中的应用。MVP架构模式是一种演变自MVC架构的新模式,其中View和Model之间的通信通过Presenter进行。相比MVC架构,MVP架构将交互逻辑放在Presenter内部,而View直接从Model中读取数据而不是通过Controller。本文还探讨了MVP架构在国庆技术博客中的具体应用。 ... [详细]
  • 本文介绍了ASP.NET Core MVC的入门及基础使用教程,根据微软的文档学习,建议阅读英文文档以便更好理解,微软的工具化使用方便且开发速度快。通过vs2017新建项目,可以创建一个基础的ASP.NET网站,也可以实现动态网站开发。ASP.NET MVC框架及其工具简化了开发过程,包括建立业务的数据模型和控制器等步骤。 ... [详细]
  • Android源码中的Builder模式及其作用
    本文主要解释了什么是Builder模式以及其作用,并结合Android源码来分析Builder模式的实现。Builder模式是将产品的设计、表示和构建进行分离,通过引入建造者角色,简化了构建复杂产品的流程,并且使得产品的构建可以灵活适应变化。使用Builder模式可以解决开发者需要关注产品表示和构建步骤的问题,并且当构建流程发生变化时,无需修改代码即可适配新的构建流程。 ... [详细]
author-avatar
-像我这样笨拙的生活_992_559
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有