`
fkpwolf
  • 浏览: 49907 次
  • 性别: Icon_minigender_1
  • 来自: 爱你就是认识我自己
文章分类
社区版块
存档分类
最新评论
阅读更多

1. 这是什么?

这是macruby的一个Gem,用来快速开发mac GUI应用。

2. 安装

首先安装macruby,我装的是0.11版本。然后运行sudo macgem install hotcocoa,这个package默认是没有安装的。

3. 运行命令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的了。

5. 编译没问题的话就可以看到界面了。不过还没完,试试ruby的closure语法,不然妄走一趟。

01 def start
02   application :name => "W3" do |app|
03   app.delegate = self
04   window :frame => [100100500500], :title => "W3" do |win|
05     title = label(:text => "Hello from HotCocoa.":layout => {:start => false})
06     win << title
07     name = text_field(:text => 'you name please')
08     win << name
09     win << button(:title => 'go'do |b|
10        b.on_action do
11           title.text = "hi," + name.stringValue
12        end
13     end
14     win.will_close { exit }
15 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这种工具就更爽了。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics