お?いけるくさい?

iPhoneアプリエンジニアのたまごです。いっちょまえエンジニア目指してちいさな発見や学んだことを覚え書きしていきます!Objective-C/iOS/開発

画面遷移のおさらい!

前回のアプリではモリさんにこの部分ちゃちゃっと書かれちゃった

書いていただいたので、画面遷移のRootContorllerちゃんの実装が

実際あまりよくわかっていなかった。

だからおさらい!

 

今回はTabBarを使ったサンプルアプリを作ります。

画面は

MusicViewController

PointViewController

InfiViewContorller

の3つとします。

 

①Single-View Applicationで新規作成

②デフォでViewCotrollerってなってるクラスファイルの名前をすべて

 MusicViewContollerに変更

 ※その際にコード中の"ViewController"ってなってる箇所を"MusicViewContoller"に。

②AppDelegate.hの#importのViewContorollerもMusicViewContollerにして、

 以下を追加

@interface AppDelegate : UIResponder <UIApplicationDelegate>{

    UIViewController* _rootController;

}

③@propertyのとこにある

 @property (strong, nonatomic) ViewController *viewController;

 を書き換えて、rootControllerをプロパティに設定。

 @property (strong, nonatomic) UIViewController *rootController;

 シンセサイズも忘れずに書き換える。

 @synthesize rootController = _rootController;

 書き換えるってのは、「削除して追加する」作業を略してるだけね。

④そしたら。AppDelegate.mのアプリ起動後の記述部分を見ますと、

 デフォではきっとこう書いてあるはず。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

    self.window = [[[UIWindowalloc] initWithFrame:[[UIScreenmainScreen] bounds]] autorelease];

    // Override point for customization after application launch.

    self.viewController = [[[ViewControlleralloc] initWithNibName:@"RootViewController"bundle:nil] autorelease];

    self.window.rootViewController = self.viewController;

    

    [self.windowmakeKeyAndVisible];

    returnYES;

}

 これの、コメント部から下を、下段2行を残して書き換えます。

//    // Override point for customization after application launch.

//    self.viewController = [[[ViewController alloc] initWithNibName:@"RootViewController" bundle:nil] autorelease];

//    self.window.rootViewController = self.viewController;

 

    //基点となるControllerを作成

    _rootController = [[UITabBarControlleralloc]init];

    

    //ViewControllerたちのコピーを作って、

    MusicViewController* tab1 = [[[MusicViewControlleralloc]init]autorelease];

    PointViewController* tab2 = [[[PointViewControlleralloc]init]autorelease];

    InfoViewController* tab3 = [[[InfoViewControlleralloc]init]autorelease];

    

    //他のViewContorollerControllerにまとめて追加

    NSArray* controllers = [NSArray arrayWithObjects:tab1,tab2,tab3,nil];

    [(UITabBarController*)_rootControllersetViewControllers:controllers animated:NO];

    

    //WindowControllerviewを追加

    [self.windowaddSubview:_rootController.view];

    

    //さわらない

    [self.windowmakeKeyAndVisible];

    returnYES;

}

⑤そうして実機でRunしてみると、

 tab1で設定した画面だけなんかグレーがかっている...なぜ?

 ちなみにこの画面、SingleViewとして元々入ってたViewの名前を変更したヤツ。

 比較してみると、.mの中に

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

{

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

    if (self) {

        // Custom initialization

    }

    returnself;

}

 がない!これを追加してみたけど、変わらず...

 .xibを確認してみると、原因発見。

 こいつだけ、Viewがグレー。

 多分、Viewに何も乗っていない状態。

 

 てことは、こいつにViewをのせてあげれば解決はするんやけど...

 なんかやだな。この無駄な階層構造。意味あるのか。

 でも、もともと存在してたファイルを消すと、動かなくなりそうでこわい。

 

 ちょっと別バージョンで作ってみて、

 それは完全にこのデフォルトのViewController(→MusicViewController)

 を削除して、新規のMusicViewControllerで動くのかやってみようと思う。

 

 あ、あとはdeallocで_rootControllerをreleaseしてあげるのも忘れず!