Room 3100

RubyMotionのチュートリアルでハマったところ

概要

RubyMotionチュートリアルサイトを進めています。 しかし、チュートリアルが書かれてからだいぶ経つせいか ところどころハマりそうな部分がありましたので、ここにメモとして残しておきます。

UILabelの背景色

7章でUILabelにModelの値変更を反映させるのですが、iOS7で変更があったのかどうなのか 指示どおりに作ってもラベルが見えません。

実は背景色が黒になっていることが原因なので、明示的に白を指定することで解決しました。

  def application(application, didFinishLaunchingWithOptions:launchOptions)
    #..
    @name_label.backgroundColor = UIColor.whiteColor
    #..
    @email_label.backgroundColor = UIColor.whiteColor
    #..
    @id_label.backgroundColor = UIColor.whiteColor
    #..

SpecでUIButtonのtapができない

こちらはよく原因がわからないのですが、8章でコントローラのspecを書く際に、 うまくタップイベントが発生してくれないという問題があります。

class ButtonController < UIViewController
  def viewDidLoad
    super

    @button = UIButton.buttonWithType(UIButtonTypeRoundedRect)
    @button.setTitle "Test me title!", forState:UIControlStateNormal
    @button.accessibilityLabel = "Test me!"
    @button.sizeToFit
    @button.addTarget(self, action:'tapped', forControlEvents:UIControlEventTouchUpInside)

    self.view.addSubview @button
  end

  def tapped
    p "I'm tapped!"
    @was_tapped = true
  end
end

こうしたコントローラを作成し、

describe ButtonController do
    tests ButtonController

    it "changes instance variable when button is tapped" do
      tap 'Test me!'
      controller.instance_variable_get("@was_tapped").should == true
    end
  end

上記のようなspecがあったとします。ここでrake specを実行すると、 controllerに@was_tapped がないと言われてしまいます。 (おそらくtapできていないため)

これについてはtwitterで公式アカウント(@RubyMotion)に質問している人もいました。が、解決になってないような。。

また、PragProgのRubyMotion本に関するフォーラムでもこの問題は指摘されています。

Pragmatic Forums - Section 6.2 Testing App UI and Controllers problem

いまいち根本的な解決には至っていないようですが、暫定的な対処法としてUIButtonのframeに以下のような設定をすると良いと書かれていました。

@button.frame = CGRect.new([10,70], @button.frame.size)

実際に試すと、本当にこれで問題が解決しました。

まとめ

RubyMotionは書いていて楽しいですが、あまり情報が多くないためこういったハマりポイントがあると辛そうです。

© 2015 3100 - All code snippets on this site is licensed under a Creative Commons Attribution 3.0 Unported License.