スキップしてメイン コンテンツに移動

iPhoneアプリを作る上でのモヤモヤを解消したい

フレームワークなんか使わなくてもガリガリコード書いちゃえばいいんだけど、なんか損してるんじゃないかと気になるのですよ。 でもフレームワークが自動的に色々やってくれてるのはありがたいのだけれど、何をやっているのか気になってモヤモヤしてしまう、というジレンマがあったりなかったり。
という訳でまずは、Xcode で Empty Application と Single View Application (Storyboard付き)で何か違うのかを調べてみた。

単純にコードの差分を比較すると以下の違いがあることがわかる。
追加されているファイル:
  • ViewController.h
  • ViewController.m
  • MainStoryboard.storyboard
ViewControllerはUIViewControllerからの派生で、viewDidLoadとdidReceiveMemeoryWarningだけがオーバーライドされただけのひな形。 MainStoryboard.storyboardは、ViewControllerとFirstResponder, Exit ViewControllerにはUIVIewが1つだけ配置されている。
ここまでは、ひな形が追加されているというだけなので、特にモヤモヤはなし。

次に差分のあるファイル:
  •  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.xcodeproj中身については脇に置いておこう。
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を使ったアプリの構造も同じパターンなので安心して使えるようになる?かも

コメント

このブログの人気の投稿

repo init の使い方覚書

Androidのソースコード管理ツール repo についての覚書. 使用例 repo init -u git://android.git.kernel.org/platform/manifest.git -b cupcake -u URL "URL"にはマニフェストファイルのリポジトリのURLを指定する. 通常は git://android.git.kernel.org/platform/manifest.git を指定する. -b REVISION マニフェストファイルのブランチまたはリビジョンを指定する. どんなブランチやリビジョンがあるかは、 http://android.git.kernel.org/platform/manifest.git を参照. 省略すると"master"になる. 一度作成したrepoクライアントのマニフェストファイルのブランチは repo init -b で変更できる. ただし、変わるのはマニフェストファイルのブランチのみ. ソースコードに反映させるには, repo sync が必要. -m NAME.xml 初期化時にrepoクライアントに作成されるマニフェストファイルのファイル名. 省略すると default.xml になる.

Ubuntu で emacs の Ctrl + Space で Mark set できない問題

Ubuntu 9.04 のデフォルト環境で emacs を使っているとき、 Ctrl + Space でマークをセットしようとすると SCIM(IME) が 立ち上がってマークができません。 Ctrl + @でもマークを設定できるバインディングになっているみたいですが 長年、Ctrl + Space を使ってきたので、SCIMを起動させなくする方法を調べました。 1.[System] -> [Preferences] -> [SCIM Input Method Setup]を起動。 2.左のリストから、[FrontEnd : Global Setup] を選択。 3.[Hotkeys] の [Trigger] の [...] ボタンを押して、Select the trigger keys を起動。 4."Control + space" を選択して、[Delete] ボタンを押す。 5."Control + space" が消えたら、[OK] 6.更に SCIM Input Method Setup も [OK] で閉じる。(ダイアログが出ても[OK]でOK) これで、スッキリしました。