読者です 読者をやめる 読者になる 読者になる

Life is Really Short, Have Your Life!!

ござ先輩の主に技術的なメモ

RoboVM + StoryBoardのチュートリアルをやってみた

RoboVM

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のコードにバインドされずに動かないそうです。

github.com

    @Override
    public void viewDidLoad() {
        super.viewDidLoad();
        //do your initilzation logic
    }

xibだけIBで作ってJavaで作ったViewControllerとバインドして、画面遷移はStoryBoardに頼らず頑張るヒトも多い気がするな、これ。