《开发愤怒的小鸟的Lua语言:Wax框架详解》中介绍了Wax及其优点。本篇我们先为大家准备Wax框架的下载包。您可以下载Wax并与我们一起完成使用Wax的过程构建,一个简单的应用程序。
该应用程序显示Twitter 上当前热门主题的列表,可以使用按钮进行更新。完成整个过程后,也许一个想法会让你开发出自己的“愤怒的小鸟”。最后结果:
第1步:分析AppDelegate.lua
如果您查看当前的AppDelegate.lua,您会注意到几个方面。首先,您会注意到这个Lua 文件的第一行。这一行是Objective-C 类声明。我们创建了一个名为“AppDelegate”的类,它符合“UIApplocationDelegate”协议。接下来,您将看到文件中唯一的方法:“applicationDidFinishLaunching”。每当应用程序启动时,就会调用这个著名的方法。应用程序现在可以在屏幕上显示内容。 “applicationDidFinishLaunching”里面的代码基本上不需要解释。它创建一个具有蓝色背景的新窗口,然后在顶部放置一些白色文本。然而,我们需要的是一个Twitter 客户端,而不是一个“Hello Lua!”屏幕。您不妨从创建一个UITableViewController 开始。
第2步:熟悉UITableViewController
在脚本目录中创建一个名为“TwitterViewController.lua”的新文件。如果你记忆力好的话,你会记得为了声明一个新的Objective-C 类,我们需要使用waxClass函数。如果你记忆力好的话,你会记得waxClass的工作原理是这样的:waxClass{'CLASSNAME','PARENT_CLASS'}
我们需要一个扩展UITableViewController 的类,所以它看起来像这样:waxClass{'TwitterViewController',UITableViewController}
我们已经定义了类,现在处理初始化。在我们的“init”方法中,我们将表设置为“grouped”而不是默认的“plain”。由于我们还想显示趋势表,所以还需要初始化保存所有趋势的Lua表: functioninit(self)self.super:initWithStyle(UITableViewStyleGrouped)self.trends={}wordreturnselfend
基本上不需要解释。
第三步:准备桌子
现在我们有了一个分组表,我们需要一个标题。我们使用“viewDidLoad:”方法来实现这一步。 functionviewDidLoad(self)self:setTitle('MyFirstWaxApplication')self:tableView():setAllowsSelection(false)end
根本不需要解释。我们只是将标题放在屏幕顶部的栏上,并防止用户选择表中的任何行。我们不希望用户选择任何行,因为我们不想处理此操作。您可以在Apple 的UITableViewController 文档页面上查看可以调用哪些其他方法。请记住:您必须使用“:property()”和“:setProperty(value)”方法,而不是属性。按Xcode 左上角的“运行”,应用程序应如下所示:
第四步:UITableViewController数据方法
我们的应用程序启动,这很棒,但我们想要显示一些数据。为了显示这些数据,所有UITableViewController 都必须实现多种方法来告诉设备要显示哪些数据。第一个方法是“numberOfSectionsInTableView:”,它返回将在表中显示的组数。此步骤对于该应用程序来说很容易,因为我们只需要一个表段,即具有当前趋势的表段。 functionnumberOfSectionsInTableView(self,tableView)return1end
这不容易吗?现在我们必须实现“tableView_numberOfRowsInSection”方法,它告诉设备特定分组中有多少行。对于该应用程序来说,这也很容易,因为我们只有一个表段。还记得我们如何使用“init”方法初始化Lua 表吗?只需计算表中的条目数即可知道表需要显示多少行: functiontableView_numberOfRowsInSection(self,tableView,section)return#self.trendsend
这使用Lua 简写方法来计算表中的条目数。如果你不熟悉Lua 表,这里有几个要点:
1.大多数语言中所谓的字典,在Lua中称为表。
2. 在大多数语言中所谓的数组被称为带有序数键的表。
3.“数组”使用从1 开始的索引,而几乎所有其他语言都使用从0 开始的索引。
接下来是“tableView_titleForHeaderInSection”方法。此方法告诉设备将什么显示为组的标题。您只需返回特定组的字符串,标题就会神奇地出现在表格行上方: functiontableView_titleForHeaderInSection(self,tableView,section)ifsection==0thenreturn'CurrentlyTrendingTopics'endreturnnilend
非常简单。现在我们只需要用来自Twitter 服务器的数据填充表即可。如果你熟悉Objective-C 中的UITableViewControllers,你会认识下面这个方法: functiontableView_cellForRowAtIndexPath(self,tableView,indexPath)localidentifier='TwitterTableViewControllerCell'localcell=tableView:dequeueReusableCellWithIdentifier(identifier)or UITableViewCell:initWithStyle_reuseIdentifier(UITableViewCellStyleDefault,identifier)localobject=self.trends[indexPath:row()+1]--必须是+1,因为Lua数组从1个单元格开始:textLabel():setText(object)returncellend
这个方法稍微复杂一点。首先,我们定义一个标识符,该标识符对于同一类型的所有表格单元格是唯一的,但可能具有不同的内容。在本例中,我们将其称为“TwitterTableViewControllerCell”。接下来,我们使用Lua简写方法来获取UITableViewCell的实例。请注意夹在这两个方法调用之间的“或”。如果第一个方法调用的结果不是false 或nil,则“cell”设置为第一个方法调用的值。否则,“cell”将被设置为第二个方法调用的结果。我们这样做是为了节省内存。这样,设备一次只需为屏幕上的大约10 个表格单元分配内存,而不需要为数据源中可能存在的数千个表格单元分配内存。当然,我们不会有数千行要显示,但这仍然是一个需要养成的好习惯。接下来,我们将表格单元格的内容设置为从self.trends“数组”的适当部分获取的趋势。我们知道索引永远不会超出self.trends 的范围,因为我们通过方法“tableView_numberOfRowsInSection”告诉设备数组大小。最后,我们返回到刚刚创建的表格单元格。如果您现在按“运行”,它应该如下所示:
#p#字幕#e#
第5 步:从Twitter 加载数据
现在,真正展现Wax 魔力的有趣部分是:从Internet 加载JSON 数据,或者更准确地说,从Twitter 服务器加载JSON 数据。让我们首先创建一个名为“loadDataFromTwitter”的新方法。此方法将从Twitter 的服务器获取JSON 数据,然后使用新数据重新加载表。
functionloadDataFromTwitter(self)
UIApplication:sharedApplication():setNetworkActivityIndicatorVisible(true)--showspinner
wax.http.request{,回调=函数(json,响应)
UIApplication:sharedApplication():setNetworkActivityIndicatorVisible(false)--hidespinner
ifresponse:statusCode()==200then
self.trends={}--刷新趋势时重置趋势列表
forindex,valueinipairs(json['trends'])do--iterateoveratablewithnumericalkeys
table.insert(self.trends,value['name'])--将值附加到'array'
结尾
结尾
self:tableView():reloadData()
结尾}
是的,就是这么简单。您定义请求的URL 以及请求完成后要执行的回调。 Wax自动确认服务器在运行JSON后会自动将JSON文本转换为Lua表。这使得显示网络活动指示器(设备右上角靠近无线信号指示器的图标)变得非常容易。返回的JSON 如下所示。键“趋势”包含一组对象,其中包含趋势名称和用于访问提及该趋势的所有Twitter 消息的URL。
将趋势名称存储在self.trends 变量中并重新加载tableView 后,它可以再次调用我们之前定义的所有数据方法。这导致表中显示的趋势与最终产品非常相似。
如果您尝试立即运行该应用程序,看起来不会有任何不同。那是因为该方法从未被调用。如果从“viewDidLoad:”内部调用此方法,我们可以确保始终显示最新趋势。在“viewDidLoad:”方法的最后一行之前添加此行:
self:loadDataFromTwitter() 如果您单击“运行”,应用程序将看起来有点像这样(您必须等待几秒钟才能加载趋势,请密切关注该活动指示器!):
第六步:添加重新加载按钮
该应用程序非常棒。然而,如果有一个重新加载按钮可以让您显示最新趋势那就太好了。幸运的是,这很容易实现。
不妨将重新加载按钮放在屏幕的右上角。苹果实际上为了方便提供了一个带有刷新图标的按钮,所以使用这个按钮就可以了。首先使用“viewDidLoad:”方法创建一个按钮。在“loadDataFromTwitter”调用之前添加以下行。
本地按钮=UIBarButtonItem:initWithBarButtonSystemItem_target_action(UIBarButtonSystemItemRefresh, self, 'loadDataFromTwitter')
这将创建一个UIBarButtonItem:按下按钮后,将在当前对象实例上调用“loadDataFromTwitter”方法。如果您想尝试其他风格,可以在此处找到列表。
我们已经创建了按钮,现在我们需要将其添加到我们的界面中。使用UITableViewController 使这项工作变得轻松简单,我们只需在导航栏对象实例上调用“setRightBarButtonItem:”方法,如下所示(此行位于上面给出的行之后): self:navigationItem():setRightBarButtonItem(button)
如果一切都正确的话,完成的应用程序应该如下所示:
第七步:额外福利
该项目的一个有趣的扩展是使加载指示器更加明显。这可能需要将UIActivityIndicatorView 放置在按钮位置之一。
综上所述
我希望您发现本教程是对Wax 的深入介绍。如果您想查看更多特定主题的蜡教程,请给我留言。
#p#字幕#e#