WEB开发网
开发学院手机开发iPhone 开发 Lua编写iOS程序 阅读

Lua编写iOS程序

 2012-10-08 13:42:08 来源:WEB开发网   
核心提示:DIY很容易把Lua解释器放到iOS app中,打开一个Xcode项目把Lua的源文件(除lua.c和luac.c命令行程序外)加到项目中,Lua编写iOS程序(4),编译,你就可以使用标准的LuaC API去创建一个解释起并运行源代码,通过Wax,你能轻易用Lua继承一个OC类!列表6展示用扩Wax实现对viewCo

DIY

很容易把Lua解释器放到iOS app中。打开一个Xcode项目把Lua的源文件(除lua.c和luac.c命令行程序外)加到项目中。编译。你就可以使用标准的LuaC API去创建一个解释起并运行源代码,就像 iLua所做的。你可以在 http://github.com/profburke/ilua下载这个示例代码。iLuaShell是一个简单的view-based application,它提供两个文本框给用户——一个给用户输入Lua代码,另一个是不可编辑的,仅仅是显示Lua代码计算的结果。

这个工作用evaluate方法完成,如列表5所示。在方法中首先获取第1个文本域的值,把它交给Lua解释器解析和执行,然后把Lua输出结果放到第2个文本域中。

列表 5 evaluate 方法

-(void)evaluate {

int err;

[input resignFirstResponder];

lua_settop(L, 0);

err = luaL_loadstring(L, [input.text

cStringUsingEncoding:NSASCIIStringEncoding]);

if (0 != err) {

output.text = [NSString stringWithCString:lua_tostring(L, -1)

encoding:NSASCIIStringEncoding];

lua_pop(L, 1);

return;

}

err = lua_pcall(L, 0, LUA_MULTRET, 0);

if (0 != err) {

output.text = [NSString stringWithCString:lua_tostring(L, -1)

encoding:NSASCIIStringEncoding];

lua_pop(L, 1);

return;

}

int nresults =lua_gettop(L);

if (0 == nresults) {

output.text = @"<no results>";

} else {

NSString *outputNS = [NSString string];

for(int i = nresults; i > 0; i--) {

outputNS = [outputNSstringByAppendingFormat:@"%s ",

lua_tostring(L, -1* i)];

}

lua_pop(L, nresults);

output.text = outputNS;

}

}

注意错误的捕捉和处理被极度简化了。一个好的Luashell应该要做得更多一些,并不是随随便便就可以往苹果商店中放的…

这样做的弊端在哪里?最大的问题是到OC的桥接丢失了。理想状态下我们应该从Lua中调用OC方法,以及相反方向的调用。Lua中要是能实现代码回调和委托方法就太爽了。

iPhone Wax

CoreyJohnson的iOS Wax最吸引人的地方是在Lua和OC间实现了相互调用。通过Wax,你能轻易用Lua继承一个OC类!列表6展示用扩Wax实现对viewController类的扩展。这段代码是DIY小节中提及的app的一部分。

列表 6:RootViewController.lua

waxClass{'RootViewController', UI.ViewController }

function init(self)

self.super:init()

self.input =UI.TextView:initWithFrame(CGRect(20, 20, 280, 114))

self.output =UI.TextView:initWithFrame(CGRect(20, 184, 280, 225))

localevalButton = UI.Button:buttonWithType(UIButtonTypeRoundedRect)

evalButton:setTitle_forState('Evaluate', UIControlStateNormal)

evalButton:setFrame(CGRect(200,142, 100, 32))

evalButton:addTarget_action_forControlEvents(self, 'eval:',

UIControlEventTouchUpInside)

self.evalButton = evalButton

self:view():addSubview(self.input)

self:view():addSubview(self.output)

self:view():addSubview(self.evalButton)

return self

end

function eval(self, sender)

self.input:resignFirstResponder()

local code,errmsg = loadstring(self.input:text())

if not codethen

self.output:setText(errmsg)

return

end

上一页  1 2 3 4 5 6  下一页

Tags:Lua 编写 iOS

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接