スマホアプリのUIデザインとプログラム作成の分離

スマホアプリ開発について。
どうもUIデザインとプログラム作成を物理的にも別々のチームで実施しなければならいようで、「UIデザインの成果物とプログラム作成の成果物」をなんとか分離できないものかと画策しています。

まぁ世間のアプリ開発しているチームの大半はデザイン担当とプログラム作成担当は隣のデスクで分離なんていらないのかも知れませんが…。

まず、AndroidについてはXMLにレイアウトが集約されており、ActivityクラスからXMLの名前をしていし、そこからXML上に設定された各部品のidを指定する事ができるので、こちらはUIデザイン担当はXMLの作成とidの指定をすれば良いであろう、という見解になりました。

問題はiOSについてで、どうやらStoryboardを何も考えずに使うと、ViewとControllerクラスの宣言がStoryboard上でくっついているので「後からコーディングでViewとControllerを紐付ける」という操作が出来ない様子。

実際、プログラム上でself.storyboard instantiateViewControllerWithIdentifierを使っても返ってくるのはControllerなのでviewだけ引っこ抜く事が出来ません。(ここでのselfはカスタムVewController)
で、一旦tempControllerという変数に入れて、self.view = tempController.viewとか無理矢理やってみたけど、だめだった。

色々さまよった結果、どうやらStoryboardを使いながらカスタムViewControllerを使うなら、Storyboard上で各画面(シーン)にカスタムViewController紐づける必要がある、というやり方しか見つけられなかった。それではUIデザイン担当がカスタムViewControllerのクラス名を知ってもらう必要が出てくるので、もう少しUIデザイン側がプログラムを知らなくても良いようにしたいなと。

で、Storyboard以前の仕組みであるNibファイルを使うやり方だと、Nibファイル側では具体的なControllerクラスの名前を知らなくても、Controllerクラス側でNibファイルと自身のviewを紐づける事ができるので、デザイン担当はviewやcellなどのパーツを作り上げ、プログラマ側はController内で必要なviewを取り込み、それぞれのパーツのイベントハンドラーもviewDidLoadあたりのプログラム上で登録すればよい様子。

ちなみに、Nibのfile's ownerはUIViewControllerにしないと動かない、と思っていたら、カスタムViewControllerの中でloadViewメソッドをオーバーライドして、その中でloadNibNameを使えばできるみたい。
最初はinitWithNibNameのなかでself setViewをしていたのだが、それではviewDidLoadが呼ばれないので、こちらにしてみた。

以下、抜粋
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    //このメソッドはいじらない
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {

    }
    return self;
}

//これオーバーライド
- (void)loadView{
    UIView *tempview = [[[NSBundle mainBundle] loadNibNamed:@"First" owner:self options:nil]objectAtIndex:0];
    [self setView:tempview];
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    //ここは普通に必要な紐付け。IBでoutlet使う代わり。
    textField = (UITextField *)[self.view viewWithTag:1];
    button = (UIButton *)[self.view viewWithTag:2];
    buttonNext = (UIButton *)[self.view viewWithTag:3];

    //ここは必要なアクションを紐付け。パーツによってはdelegate使う。と思う。
    [button addTarget:self action:@selector(clickButton:) forControlEvents:UIControlEventTouchUpInside];
    [buttonNext addTarget:self action:@selector(clickButtonNext:) forControlEvents:UIControlEventTouchUpInside];
    
}

//以下略


この辺むずかしいなー


コメント

このブログの人気の投稿

ユースケースポイント法(UCP法)

COCOMO(工数と工期)

seleniumをmacで使いたいメモ1