ぽっちぽちにしてやんよ

技術ネタとかアプリに関する話とか

[RubyMotion] InterfaceBuilderと合わせて使って楽をしよう

catch

RubyMotionはいいんだけど,UIをコードで作るのはめんどくさい. そのため,InterfaceBuilderで作りたい.

RubyMotionの進化が早くて,もう1.3のアップデートが来てます. このエントリーは1.3にアップデートしてからやってね.

$ sudo motion update

やってみます.まずはひな形作成.

$ motion create IB
$ cd IB

app/app_delegate.rb を編集します.

class AppDelegate
  def application(application, didFinishLaunchingWithOptions:launchOptions)
    @window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds)
    @window.rootViewController = NSBundle.mainBundle.loadNibNamed(
        'MyView', 
        owner: self,
        options: nil).first
    @window.rootViewController.wantsFullScreenLayout = true
    @window.makeKeyAndVisible
    true
  end
end

こんな感じで,MyViewっていうNibを読み込んでやることにします.

おもむろにXCodeをたちあげて,(すでに開いている人は開いてるProjectを閉じろ!)File>New>File(Cmd + N)を選んで新規ファイル作成する. iOSのUser InterfaceのEmptyを選んで,resources/MyView.xibとして保存する.

このままだと,ただの方眼紙なので,オブジェクトを追加していきます.

ObjectLibrary(Cmd+Shift+Alt+3)からViewControllerを追加.

viewcontroller

CustomClassの所で,MyViewControllerとする.

ObjectLibraryからViewを追加.

ObjectLibraryからButtonとLabelを追加.

この部分が重要で、それぞれのTagに1とか2とかつけます

保存して終了.

次にapp/my_view_controller.rbを作成します.

class MyViewController < UIViewController
    def viewDidLoad
        @button = view.viewWithTag 1
        @label = view.viewWithTag 2
        @button.addTarget(
        self, 
        action:'onClicked', 
        forControlEvents:UIControlEventTouchUpInside)
end

def onClicked
    @label.text = "Clicked"
end
end

1のTagを付けたのをbuttonとして,クリックのイベントをonClickedメソッドに登録. 2のTagを付けたのをlabelとして,クリックされた時に変更したりするようにしました.

$ rake

でビルドしてシミュレータが立ち上がります.

押します.

変わります!

出来ました!

[Rubymotion] Rake Specをカラフルにしよう!

RubyMotionはBaconというテストフレームワークを使っています. RSpecとの違いがよく分からない.

$ rake spec

とやると,spec以下のテストが実行されるっぽいです.

ところが,普通に

$ motion crate redgreen
$ cd redgreen
$ rake spec

とやると,ビルドされてシミュレータが立ち上がりテストが実行されますが,白黒です.

そこで,specフォルダで一番初めに読み込まれる .rbの中でカラー表示にさせるスクリプトを実行させれば,カラー表示になるようです. (そのため, 00***.rbのような名前にすれば良いようです.)

RedGreenというrake specをカラフルにするライブラリがあるらしいのですが,それをRubyMotion用にアレンジしたものがgithubで公開されています.

rm-redgreen

spec/00-redgreen.rb app/app.rb app/kernel.rb app/rm-ansiterm.rb app/string.rb を自分のとこに持ってくれば使えます.

先程のmotion createしただけのやつにコピーして再度テストをすると,このようになります.

カラフルになりましたね.

デフォルトのテストはWindowがあるのを調べるテストなので,実装を書いてGreenにしましょう.

./app/app_delegate.rb

class AppDelegate
  def application(application, didFinishLaunchingWithOptions:launchOptions)
    @window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds)
    true
  end
end

テストを再実行します.

$ rake spec

Greenになりました.

./spec/00-redgreen.rbstyle = :focusedとなっている部分をstyle = :fullとすると長めのログが出ます.

[RubyMotion] NSError ** とかを引数に取るメソッドを使う時どうすればいいか

iOS SDK 使ってると,こんな感じのコードがよくあります.

NSHTTPURLResponse *res;
NSError *error;
NSURL *url = [NSURL URLWithString:@"http://google.com"];
NSURLRequest *req = [NSURLRequest requestWithURL:url];
NSData *data = [NSURLConnection sendSynchronousRequest:req returningResponse:&res error:&error];

最後の[NSURLConnection sendSynchronousRequest: returningResponse: error:]の部分で,(NSHTTPURLResponse**)とか(NSError**)とかを引数に取ります.

この場合は,RubyMotionで書くとこうなります.

err_ptr = Pointer.new(:object)
res_ptr = Pointer.new(:object)
url = NSURL.URLWithString("http://google.com")
req = NSURLRequest.requestWithURL(url)
data = NSURLConnection.sendSynchronousRequest(
    req, 
    returningResponse:res_ptr,
    error:err_ptr)

@label.text = res_ptr[0].statusCode.to_s

簡単に言うと,(NSError**)とかを渡す所になっているメソッドは,Pointerのインスタンスを渡してあげて,error = err_ptr[0]とかしてデリファレンスして使ってやるといいです.

Octopress始めてみた

あいさつ

Posterous→Bloggerと来て次はOctopressでやってみようと思います.

なんでOctopressでやってみようと思ったか?

最近RubyMotionをやってて,それ関連の記事を書くことが何回ありました. 基本的に調べながらやってるんですけど,その時はDayOneとかを使ってやってるわけです.

そこで,BloggerがMarkdownでそのまま投稿出来ないのが辛かった.

DayOneで書いて,MouにコピペしてHTMLとして吐かせてコピペしてました.苦行. それに更に最近ではKobitoにもコピペしてQiitaにも投稿してました.

これはもうMarkdownで統一するしかないだろうということで, Octopressをやってみようということになったのですよ.