你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> Wax框架簡明教程(3)開始使用Wax

Wax框架簡明教程(3)開始使用Wax

編輯:IOS開發綜合

概述

這是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. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved