woshidan's loose leaf

ぼんやり勉強しています

2.2 UITabController

後追いで、
2.2 UITabController · mixi-inc/iOSTraining Wiki · GitHub

を読んでます。

昨日はちょっとまとめて、とちった感じのデバッグだけしました。

UITabBarControllerを使って画面を作ってみます。

TabBarControllerを使って画面を作っていく際に、自分でクラスにコードを書いていく方法とStoryBoardを用いた方法があるみたいです。

自分でクラスにコードを書いていく場合

  • TabBarを使うときに注意する必要があるクラスは、AppDelegate, UIViewController(TabBarControllerから表示されるもの)
    • AppDelegate
      • アプリが起動したり終了したりバックグラウンド状態になったりしたときに呼ばれるクラス。今回はそのクラスでdidFinishLaunchingWithOptionsメソッド内、つまりアプリの起動が終了したときに、rootViewControllerにtabBarControllerを指定してから表示するように設定している。
    • UIViewController(TabBarControllerから表示されるもの)
      • initWithImageName内で、TabBarに表示するタイトルとアイコンの設定を行う
  • プロジェクトを作成するときはTabbed Applicationを指定して作成する
    • self.tabBarItem.badgeValue = @"5"のようにしてtabBarの上にバッジを表示する事が可能

StoryBoardを用いる場合

  • プロジェクトを作成するときはTabbed Applicationを指定して作成する
    • このとき、指定しているのはプロジェクトテンプレートというんですね、いまさら知った……
  • 新しくViewControllerを追加する手順
    • 追加したいUIViewControllerをStoryBoard上で作成
    • TabBarControllerからCtrlを押しながらViewControllerへドラッグ
    • ウィンドウが出てくるのでRelationship Segue -> view controllersを設定する

上のほうの演習に従って実行しようと思ったら実行できなかったから困りました。

#import <UIKit/UIKit.h>
#import "AppDelegate.h"

int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

で、AppDelegate.hをもう一度見てみたら、

@interface AppDelegate : UIResponder <UIApplicationDelegate, UITabBarControllerDelegate>

, UITabBarControllerDelegate>

が抜けてたので足しても動かなくて、実装ファイルかえてないな、という感じだったので、 きちんとログメッセージ読んだら、

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle </Users/woshidan/Library/Developer/CoreSimulator/Devices/AB85540C-33B7-45B8-B7CB-D74BB81A9A0B/data/Containers/Bundle/Application/B83A0873-DF47-48CB-9281-1A211330F3F0/ex-1.app> (loaded)' with name 'FirstViewController''

ということで、

-(id)initWithImageName:(NSString *)imageName
{
    self = [super initWithNibName:@"FirstViewController" bundle:nil];
    if (self) {
        self.title = imageName;
        self.tabBarItem.image = [UIImage imageNamed:imageName];
    }
    return self;
};

[super initWithNibName:@"FirstViewController" bundle:nil];

が行けないらしいです。
IdentifierをViewControllerにつけてあげればいいのかな、とStoryBoardから、

f:id:woshidan:20150316212031p:plain

のようにしたけど駄目。
Nibってなんだよ、となったので、 

self = [super initWithNibName:@"FirstViewController" bundle:nil];

の行で止まっていたところ、

http://qiita.com/gonsee/items/230cea1ee511d54b3e85

を読んで、あっ、Nib(xib)って、UIViewのクラスのコードあるいはコードのことかしら、と思いつきまして。
xibってstoryboardと一緒に使えなかったわー駄目だったわーと思いながら、 サンプルプロジェクト開いて、xibを発見したので、storyboardのほうの演習をあっさり終わらせて次へ行く事にしました。