首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

Wax框架简要教程(3)开始使用Wax

2012-10-12 
Wax框架简明教程(3)开始使用Wax 概述这是Wax框架的一个快速教程。通过本教程,最终你会明白在OC中使用Wax是

Wax框架简明教程(3)开始使用Wax

 

概述

这是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


热点排行