フレームワークなんか使わなくてもガリガリコード書いちゃえばいいんだけど、なんか損してるんじゃないかと気になるのですよ。 でもフレームワークが自動的に色々やってくれてるのはありがたいのだけれど、何をやっているのか気になってモヤモヤしてしまう、というジレンマがあったりなかったり。
という訳でまずは、Xcode で Empty Application と Single View Application (Storyboard付き)で何か違うのかを調べてみた。
単純にコードの差分を比較すると以下の違いがあることがわかる。
追加されているファイル:
ここまでは、ひな形が追加されているというだけなので、特にモヤモヤはなし。
次に差分のあるファイル:
app-info.plistは、以下の2行が追加されている。
<key>UIMainStoryboardFile</key>
<string>MainStoryboard</string>
UIMainStoryboardFileってのは、マニュアルによるとアプリのメインストーリーボードファイル(拡張子抜き)を指定するもので、NSMainNibFileとは相互排他であるとある。
そして、AppDelegate.m。これはapplication:didFinishLaunchingWithOptions:の中身が綺麗サッパリなくなっている。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch. return YES;
}
つまり、MainStoryboard.storyboardファイルを追加して app-info.plist に登録しておけば、あとは自動的にロードして、ウィンドウ作ったりといった初期化までやってくれている筈といことでしょうかね。
それなら自分でやってみよう!
まずは、Empty Applicationから作ったプロジェクトに、[File]->[New]->[File]->[Storyboard]でストーリーボードを追加。中身は空っぽ。気にせずapp-info.plistに登録。AppDelegateのapplication:didFinishLaunchingWithOptions:の中身を削除。実行!するとログにこんなメッセージが…
それでは、ストーリーボードにView Controllerを作って差し上げましょう。
さすがにXMLファイルをちまちまイジっていては日が暮れるので、ここはInterfaceBuilder上でObject LibraryからView Controllerをドラッグ&ドロップ。
すると、まぁ親切にもUIViewを一個くっつけて、First ResponderとExitも追加されました。
試しに実行するとちゃんとエラーも消えてUIも無事表示されます。
ただし、View ControllerのClassが、デフォルトではUIViewControllerになっています。動作をカスタマイズするためには、そのアプリ用にUIViewControllerの派生クラスを作って、それをストーリーボードのView ContorllerのCuston Classに設定する必要ある。(UIViewControllerの派生クラスを作ると、initWithNibName:bundle:が自動的にオーバーライドされるけど、これはコードから初期化する場合のメソッドなので、今回のケースでは削除してOK)
これで、Empty Application が、ほぼほぼ Single View Application (Storyboard付き)と同じ状態になりましたとさ。
知ってしまえばどうってことはないことですけど、これを知っていれば他のView Controllerを使ったアプリの構造も同じパターンなので安心して使えるようになる?かも
という訳でまずは、Xcode で Empty Application と Single View Application (Storyboard付き)で何か違うのかを調べてみた。
単純にコードの差分を比較すると以下の違いがあることがわかる。
追加されているファイル:
- ViewController.h
- ViewController.m
- MainStoryboard.storyboard
ここまでは、ひな形が追加されているというだけなので、特にモヤモヤはなし。
次に差分のあるファイル:
- app-info.plist
- AppDelegate.m
- app.xocdeproj/project.pbxproj
- app.xocdeproj/project.xcworkspace/xcuserdata/cozy.xcuserdatad/UserInterfaceState.xcuserstate
- app.xocdeproj/xcuserdata/cozy.xcuserdatad/xcschemes/test.xcscheme
- app.xocdeproj/xcuserdata/cozy.xcuserdatad/xcschemes/xcschememanagement.plist
app-info.plistは、以下の2行が追加されている。
<key>UIMainStoryboardFile</key>
<string>MainStoryboard</string>
UIMainStoryboardFileってのは、マニュアルによるとアプリのメインストーリーボードファイル(拡張子抜き)を指定するもので、NSMainNibFileとは相互排他であるとある。
そして、AppDelegate.m。これはapplication:didFinishLaunchingWithOptions:の中身が綺麗サッパリなくなっている。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch. return YES;
}
つまり、MainStoryboard.storyboardファイルを追加して app-info.plist に登録しておけば、あとは自動的にロードして、ウィンドウ作ったりといった初期化までやってくれている筈といことでしょうかね。
それなら自分でやってみよう!
まずは、Empty Applicationから作ったプロジェクトに、[File]->[New]->[File]->[Storyboard]でストーリーボードを追加。中身は空っぽ。気にせずapp-info.plistに登録。AppDelegateのapplication:didFinishLaunchingWithOptions:の中身を削除。実行!するとログにこんなメッセージが…
Failed to instantiate the default view controller for UIMainStoryboardFile 'Storyboard' - perhaps the designated entry point is not set?
それでは、ストーリーボードにView Controllerを作って差し上げましょう。
さすがにXMLファイルをちまちまイジっていては日が暮れるので、ここはInterfaceBuilder上でObject LibraryからView Controllerをドラッグ&ドロップ。
すると、まぁ親切にもUIViewを一個くっつけて、First ResponderとExitも追加されました。
試しに実行するとちゃんとエラーも消えてUIも無事表示されます。
ただし、View ControllerのClassが、デフォルトではUIViewControllerになっています。動作をカスタマイズするためには、そのアプリ用にUIViewControllerの派生クラスを作って、それをストーリーボードのView ContorllerのCuston Classに設定する必要ある。(UIViewControllerの派生クラスを作ると、initWithNibName:bundle:が自動的にオーバーライドされるけど、これはコードから初期化する場合のメソッドなので、今回のケースでは削除してOK)
これで、Empty Application が、ほぼほぼ Single View Application (Storyboard付き)と同じ状態になりましたとさ。
知ってしまえばどうってことはないことですけど、これを知っていれば他のView Controllerを使ったアプリの構造も同じパターンなので安心して使えるようになる?かも
コメント
コメントを投稿