概述
这是Wax框架的一个快速教程。通过本教程,最终你会明白在OC中使用Wax是多么的有趣。
- Wax是OC和Lua之间的黏合剂。也就是说,你可以在OC和Lua之间进行通信。
- 通过Wax,使用Lua访问Cocoa类如同在OC中一样简单。
NSString -- 返回 NSString
UIView -- 返回 UIView
UITableView -- 下面这一行的“语法糖”
wax.class["UITableView"]-- Wax原生调用,你不必了解
- 当年你创建OC实例时,不需要使用alloc,Wax会为你这样做。
-- 天啊,不需要alloc,retain 和 release了 !
local view = UIView.initWithFrame(CGRect(0, 0,100, 100))
- 用Lua创建OC类,使用函数waxClass{CLASS_NAME,PARENT_CLASS}。所有后续加入的函数(同一Lua文件中)都会自动添加为该类的实例方法。
waxClass{"MyClass",NSObject}
-- 声明协议
waxClass{"MyClass",NSObject, protocols = {"UITableViewDelegate","UITableViewDataSource"}}
-- 注意!协议名是字符串形式(因为它们并不是类)REMEMBER!
- 调用Lua函数时,使用{}而不是()(看waxClass函数的调用)。这是用一个Lua表来传递参数的“语法糖”。
-- 等同于第2句
waxClass{"MyClass", NSObject}
-- 大括号可以忽略,等同于第1句
waxClass({"MyClass", NSObject}) -- ...omitting the parenthesis ismuch more pretty, so that's how we roll.
- 对于waxClass函数,第1个参数总是self,以便用Wax模拟除OC的面向对象模型。
waxClass{"MyClass",NSObject}
-- 注意函数第1个参数为self。这就持有了MyClass实例对象
functionstoreWords(self, words)
self.words = words
-- Wax在self对象中创建了一个'super'的成员变量
-- 以便调用父类方法
self.super:words(self)
end
- 使用冒号 : 代替点号 . 来调用OC方法。这将把调用者自身作为第1个参数传给该方法。
--在Lua中,使用冒号 : 进行方法调用
UIApplication:sharedApplication()
--... 等同于
UIApplication.sharedApplication(UIApplication)
--使用冒号 : 是为了让代码变得简单和可读
- 如果OC 方法有多个参数,用下划线 _ 代替冒号 : 。
在OC中
[UIAlertView initWithTitle:@"title"message:@"message" delegate:nil];
使用Wax
UIAlertView:initWithTitle_message_delegate("title","message", nil)
- Wax不使用OC属性。它强制Lua和OC只通过方法调用来通信
someView.frame -- 这样不行
-- 只能用 getter/setter 方法
someView:frame()
someView:setFrame(someFrame)
- 通过点号. 可以为对象动态创建成员变量。不同于冒号 : (用于调用OC的类/实例方法),在 Lua 代码中点 . 能够动态创建成员变量(在对象的 OC 代码中则完全不知道这些变量)。这些成员变量在对象生命周期中是有效的。
--在Lua中用冒号: 进行方法调用…
localview = UIView:init()
view.someRandomVariable= "YEAH!"
--你能把任何对象赋值给一个实例,它会一直存在
- Wax视图将OC对象转换为Lua原始类型。反之亦然,如果OC方法有一个NSString参数,你直接传递一个Lua字符串给它。
local fileManager =NSFileManager:defaultManager()
local contents =fileManager:directoryContentsAtPath(".")
-- directoryContentsAtPath 返回一个 NSArray, 但 Wax 将之转换为 Lua table
print(contents[1]) --> "info.plist"
-- NSDictionaries 变成 Lua tables
-- NSArrays 变成Lua tables
-- NSStrings 变成Lua strings
-- NSNumbers 变成Lua numbers
- 如果你不象OC对象被自动转换,则可以使用toobjc方法。
-- 如果你这样调用NSString的方法是不行的
local string = "astring"
string:capitalizedString()
-- 这是因为string已经被强制转换为Luastring了
-- 使用toobjc,避免NSString被强制转换为Luastring
toobjc(string):capitalizedString()
- 枚举类型,比如UITableViewStylePlain,已经被硬编码了。目前,大部分常用枚举定义在APP_ROOT/wax/stdlib/enums.lua中。以后我希望在iPhone中使用桥接的方式以便枚举和结构能动态创建。
- 要传递一个selector,直接使用字符串。例如在OC中,selector被写成@selector(this:is:a:method),在Wax写成this:is:a:method即可。
- 结构体也同枚举一样。最常用的结构体都声明在APP_ROOT/wax/wax-scripts/structs.lua中。根据structs.lua文件中的模板很容易添加新的结构体。
wax.struct.create("CGRect","ffff", "x", "y", "width","height")
-- 创建一个全局函数叫做CGRect,带有4个float参数
-- 第2个参数"ffff"定义了4个参数的类型
local rect = CGRect(1, 2, 3, 4)
print(rect.x) --> 1
rect.x = 200
print(rect.x) --> 200
手机如何取消安全模式?
1.重装电池;
2.重新开机:在开机显示第二界面(屏幕显示htc quietly brilliant)时,按住音量增加键至主题桌面出现,即会发现恼人的安全模式已取消,尝试一下吧。
1楼a841181169昨天 19:45.................
项目地址:https://github.com/probablycorey/wax
一、什么是Wax
Wax是一个用lua语言编写本地iPhoneapp的框架。它使用OC运行时将OC和Lua进行绑定。通过Wax,你可以用Lua做任何OC可以做到的事情!你还等什么?赶快开始吧!
二、为什么用Lua编写iPhoneapp?
我喜欢写iPhone app,但仅限于使用动态语言而不是用OC来写它们。为什么许多人宁愿用Lua+Wax而不是OC?有以下几个原因:
q垃圾自动回收!alloc、retain和release的日子终于一去不复返了!
q更少的代码!不再有头文件,不再有静态类型、数组和字典语句!Lua使你的代码行数减少。
q能访问Cocoa、UITouch、Foundation这些框架,每一样都不少!Wax会将OC框架自动暴露给Lua,你想要的每个框架仍然是有效的!
qHTTP请求更简单。与RESTwebservice进行交互从来没有这么容易过!
qLua支持闭包,即块语句!如何使用过它们的人都知道它们是如何的强大。
qLua内置了正则表达式匹配库。
三、例子
关于Wax app的简单示例,请看examples文件夹。
如何创建UIView并设为红色?
--忘掉alloc吧!内存由Wax自动管理
view= UIView:initWithFrame(CGRect(0, 0, 320, 100))
--用冒号向OC对象发送消息
--所有UIView对象的方法都可用这种方法访问
view:setBackgroundColor(UIColor:redColor())
如何调用多个参数的方法?
--在方法名中加入下划线连接参数,然后象使用正常的C函数一样使用
UIApplication:sharedApplication():setStatusBarHidden_animated(true,false)
如何传递array/string/dictionary参数?
--Wax自动转变array/string/dictionary为NSArrayv/NSString/vNSDictionary对象(以及逆转换)
images= {"myFace.png", "yourFace.png", "theirFace.png"}
imageView= UIImageView:initWithFrame(CGRect(0, 0, 320, 460))imageView:setAnimationImages(images)
如何创建一个UIViewController子类?
--在"MyController.lua" 中创建
--创建一个OC类MyController,继承自UIViewController
--这其实是一个OC对象,如果有必要的话,你甚至可以在OC代码中引用它
waxClass{"MyController",UIViewController}
functioninit()
--要调用父类方法,显式地使用self.super
self.super:initWithNibName_bundle("MyControllerView.xib",nil)
returnself
end
functionviewDidLoad()
--在这里写入其它代码
end
你说HTTP调用会很轻松,我才不信呢…
url= "http://search.twitter.com/trends/current.json"
--异步调用,当收到应答调用回调函数
wax.http.request{url,callback = function(body, response)
--发出NSHTTPURLResponse 请求
puts(response:statusCode())
--由于content-type为json, Wax 会自动解析并将之封装到Luatable类型
puts(body)
end}
因为Wax会自动将NSString,NSArray,NSDictionary和NSNumber转换为原生的Lua值,有时候你必需强制转换回OC对象,例如:
local testString ="Hello lua!"
local bigFont =UIFont:boldSystemFontOfSize(30)
local size =toobjc(testString):sizeWithFont(bigFont)
puts(size)