http://docs.robovm.com/tutorials/ib-basics/ib-basics.htmlをやってみた。
おなじみのiOS開発用語が沢山出てくるので、iOSのアーキテクチャやXcodeに触ったことがなければピンと来ない気がする。IBとAutoLayoutで簡単な画面を作るチュートリアルなんだけど、AutoLayoutは実にめんどくさいのでこの段階でiOSの初心者は脱落する気がしてならない。
IBOutlet,IBActionがアノテーションとなり、CustomClassアノテーションでUIViewControllerとIB上のViewControllerを紐付ける。で、InteilJ IDEAなんかではJavaのクラスを変更するとコンパイルが走る。
で、こんなコードをJavaで書くと、Objective-Cでこんなコードが生成される。ああ、そうやって頑張ってんだなってのが見えた。
Javaのコード
@CustomClass("GreetingsController") public class GreetingsController extends UIViewController { private UILabel label; private int clickCount; private UITextField textField; @IBOutlet public void setLabel(UILabel label) { this.label = label; } @IBOutlet public void setTextField(UITextField textField) { this.textField = textField;} @IBAction private void clicked() { label.setText("Click Nr. " + (++clickCount)); } @IBAction private void textChanged() { label.setText("I see you typing!"); } }
Objective-Cのコード
/** * GreetingsController.h * * This file has been auto-generated by * RoboVM's Interface Builder Integrator. * DO NOT MODIFY! */ #import <UIKit/UIKit.h> @interface GreetingsController : UIViewController /** * IBOutlet label */ @property (weak, nonatomic) IBOutlet UILabel *label; /** * IBOutlet textField */ @property (weak, nonatomic) IBOutlet UITextField *textField; /** * IBAction textChanged * Selector: textChanged */ -(IBAction) textChanged; /** * IBAction clicked * Selector: clicked */ -(IBAction) clicked; @end
IBを使う場合、まぁ当然だけど、Javaで定義したUIKitのオブジェクトはそのままではIBに紐付かない。かといってJava側でリンクできるコードをかけるわけでもないので、Xcodeを起動してHeaderファイルのIBOutletとIB上のオブジェクトを紐付ける作業は必要になる。
このチュートリアルではIBActionを使っているのだけど、いちいちXcodeでUITextFieldとイベントを紐付ける手作業が発生してしまうので、大変めんどい。イベントハンドラの登録はすべてJava側で行うべきだと思う。こんな感じで。
button.addOnTouchUpInsideListener( new UIControl.OnTouchUpInsideListener() { @Override public void onTouchUpInside (UIControl control, UIEvent event) { label.setText("Click Nr. " + (++clickCount)); } } );
次は、Segue関係のチュートリアルをやってみるで。
あと、現在のRoboVM1.1では、Java側で書いたViewDidLoadはオーバーライドしないとObjective-Cのコードにバインドされずに動かないそうです。
@Override public void viewDidLoad() { super.viewDidLoad(); //do your initilzation logic }
xibだけIBで作ってJavaで作ったViewControllerとバインドして、画面遷移はStoryBoardに頼らず頑張るヒトも多い気がするな、これ。