hotcocoa上手
- 这是什么?
这是macruby的一个Gem,用来快速开发mac GUI应用。
- 安装
首先安装macruby,我装的是0.11版本。然后运行sudo macgem install hotcocoa
,这个package默认是没有安装的。
- 运行命令
hotcocoa w3
,具体参考官方的指南。这里会产生一个和Rails类似的目录。
4.build。 直接编译的话会有问题:Undefined symbols for architecture i386
,产生的代码都不能用,很无语。修改gem,在这里/Library/Frameworks/MacRuby.framework/Versions/0.11/usr/lib/ruby/Gems/1.9.2/gems/hotcocoa-0.5.1/lib/hotcocoa/application_builder.rb
里面的 archs = RUBY_ARCH.include?('ppc') ? '-arch ppc' : '-arch x86_64'
,把-arch i386
去掉,现在的macruby都已经只有64bit的了。
- 编译没问题的话就可以看到界面了。不过还没完,试试ruby的closure语法,不然妄走一趟。
def start application :name => "W3" do |app| app.delegate = self window :frame => [100, 100, 500, 500], :title => "W3" do |win| title = label(:text => "Hello from HotCocoa.", :layout => {:start => false}) win << title name = text_field(:text => 'you name please') win << name win << button(:title => 'go') do |b| b.on_action do title.text = "hi," + name.stringValue end end win.will_close { exit } end
可以看到,比起objective-c来直观多了,想想看objective-c是怎么操作array的,痛苦。而且这里用closure的方法比用Interface Builder来建立button的事件响应要直观、简单的多,不过就要自己手工组织layout了。能否用HTML中的event bind呢?比如这样dojo.connect(‘buttonId’, “onclick”, function(){…}
这里如果把name.stringValue写成name.text,运行时会有异常:in `’: undefined method `value’ for you name please:NSTextField (NoMethodError),可以看到这里是直接访问cocoa的foundation的。macruby是基于cocoa的运行库的,比如NSString,但是当运行macrake时有个build的过程,时间有点长,难道macruby直接把ruby代码编译成二进制?打开打包好的app文件(这里为W3.app),
可以看到这里即有二进制,也有rb的源代码。可能这里的二进制文件是编译出来的,所以需要一段时间,二进制文件大概作为程序运行的入口,比如运行ruby加载rb文件,这个和有些exe结尾的可执行java程序相像。只是这样打包后coding-build-test的周期就长了,还是“刷新浏览器”的方式爽啊,当然有firebug这种工具就更爽了。