2010年8月31日火曜日

モーダルView Controllerを閉じる

そのモーダルView Controllerを表示したのと同じView Controllerが閉じるべきなのです。親のView Controllerに、モーダルモードで表示した子を閉じるように通知するにはいくつかの方法がありますが、よく使われる方法はデリゲーションです。

参考PDF:iPhone OS View Controller プログラミングガイド

Day 2 View-basedAppricationテンプレートを使用する

appsamuck.com の実装は古い環境で構築されているため、iphoneSDK3.xで実装してみる。
その準備は以下の通り。

使用テンプレート:
View-BasedApprication
くるっと回転するビュー(modalView)の実装はWindow-basedAppricationテンプレートなるものが用意されているが、IBを使用しないで実装していくのでこちらを元にしていく。
IBを使用しないための準備は、ラベル:noIBを参照する。

デリゲーション:
さらにmodalViewは、デリゲーションを使用するようにと書かれているので 、Window-basedAppricationテンプレートを参考にデリゲートを実装する。

参考PDF:iPhone OS View Controller プログラミングガイド

viewDidLoad メソッド

viewDidLoad

Managing the View
-viewDidLoad
Called after the controller’s view is loaded into memory.
------------------
ビューはメモリー上に展開されただけで、表示はされていない。なので、ここでmodalviewは動かない。

参考URL:iOS Reference Library UIViewController Class Reference

IBを使わない場合のviewとviewControllerの作成

View-basedApricationテンプレートを使用する場合、viewとviewControllerを自作する必要がある。

1.
(プロジェクト名)AppDelegate.mファイルの、application:didFinishLaunchingWithOptionsメソッドで、UIWindowとUIViewController(を継承したRootViewController)を作成してUIWindowに追加する。

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

window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

RootViewController *viewController = [[RootViewController alloc] init];
navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];
[viewController release];

[window addSubview:navigationController.view];
[window makeKeyAndVisible];

return YES;
}

2.
UIViewCOntrollerクラスのloadViewをオーバーライドして、self.viewにviewを追加する。

-(void)loadView{
CGRect bounds = [[UIScreen mainScreen] applicationFrame]; 
UIView *contentView = [[UIView alloc] initWithFrame:bounds];

contentView.backgroundColor = [UIColor redColor];
self.view = contentView;

[contentView release];
}

参考PDF:iPhone OS View Controller プログラミングガイド プログラムによるビューの作成

ViewControllerのロードサイクル(2)

ViewControllerのロードサイクル(1)の続き

loadView

viewDidLoad

viewWillAppear

viewDidAppear

------------------------------












2010年8月26日木曜日

モーダルビューコントローラ

モーダルView Controllerは、新規に1画面分のコンテンツを表示するときに自由に使えるツールです。
モーダルView Controllerは、UITabBarControllerやUINavigationControllerのように、
UIViewControllerの特定のサブクラスではありません。
アプリケーションでモーダルView Controllerを使用する理由としては、... 何らかの情報を収集したり表示したりするために、アプリケーションのワークフローに一時的に割り込みを行うことを意味しています。
参考PDF:
iPhone OS View Controller プログラミングガイド
iPhone アプリケーションプログラミングガイド

2010年8月25日水曜日

ViewControllerのロードサイクル(1)

loadView

viewDidLoad

viewWillAppear

viewDidAppear

------------------------------

UIWindowの作成

ウインドウの最初のフレームサイズは、必ず画面全体を覆うように設定するべきです。
プログラミングによってウインドウを作成する場合は、作成時に望みのフレーム矩形を明示的に渡渡さなければなりません。画面の矩形と異なる矩形は渡さないでください。画面の矩形は、UIScreenオブジェクトから次のようにして取得できます。
UIWindow* aWindow = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen]bounds]] autorelease];
参考PDF:
iPhone OS View Controller プログラミングガイド
iPhone アプリケーションプログラミングガイド

UIViewとUIWindowとUIViewController

UIView
画面上の矩形領域を定義します。
その矩形領域内にコンテンツを表示する責務(コンテンツ表示)と、その領域内で発生したタッチイベントに応答する責務(イベント処理)を負っています。
1つ以上のサブビューを管理できます。
UIWindow
iPhoneアプリケーションは、通常、UIWindowクラスのインスタンスで表わされるウインドウを1つだけ持っています。
1つ以上のビューをそこに追加して表示します。その後は、このウインドウオブジェクトを再び参照することはほとんどありません。
UIWindowの親クラスはUIViewなので、通常はUIWindowオブジェクトのビュー関連プロパティを直接操作することはありません。

UIViewController
1つの画面のビューは、1つのView Controllerオブジェクトによって支えられています。
(View Controllerの仕事は、)ビューに表示するデータを管理することと、更新をアプリケーションのほかの部分と調整することです。
自身が管理する一連のビューを作成したり、メモリ不足状態のときにビューをメモリから削除する責務を負っています。

参考PDF:
iPhone OS View Controller プログラミングガイド
iPhone アプリケーションプログラミングガイド

2010年8月17日火曜日

InterfaceBuilder(IB)を使わないための準備

Xcodeで、IBを使わないためには以下の処理を事前に行う。
------------------------------

Window-based Applicationテンプレートを選択する。

*.xibファイルを削除する(一緒にゴミ箱に入れる)。

main.mの14行目を以下のように変更する。
int retVal = UIApplicationMain(argc, argv, nil, nil);

最後の引数を「nil」から「AppDelegateクラス名」に変更する。
int retVal = UIApplicationMain(argc, argv, nil, @"bonefire_3_xAppDelegate");

bonefire_3_x-Info.plistファイルのMain nib file base nameを削除する。

2010年8月5日木曜日

Day 2 Utility Applicationテンプレートのソースコード解析

新規プロジェクトを作成して、そのままビルドと実行を行うと、「i」ボタンが用意されている。押すとくるっと画面が回り「Done」ボタンと、ナビゲーションバーが表示される。「Done」ボタンを押すと元の画面に戻る。
IBを起動してみる。どうやら「i」ボタンはButtonアクションの設定を行っている訳ではないらしい。くるっとする動きは、showInfoで実装しているっぽい。
@protocolやら、objective-cを理解していないとむずかしい。。。

以下、理解したことのメモ。
------------------------------------
MainViewController.m
MainViewController.m→@protocol FlipsideViewControllerDelegateの実装
23-26
flipsideViewControllerDidFinishメソッド
25
dismissModalViewControllerAnimatedメソッドを実行する。
そのView Controllerと、その上にあるすべてのView Controllerが閉じられる。通常これは、その下にあるNavigation Controllerに戻るために行う。

29-38
showInfoメソッド
MainView.xibで、Viewウィンドウの右下にある「i」ボタンに紐づいている処理。
32
controller.delegate = self;
「i」ボタンが押されると、delegate(移譲先)先としてself指定する。

34
controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
コントローラのアニメーションの種類を、水平方向にパネルが回転するようなアニメーションで指定する。

35
[self presentModalViewController:controller animated:YES];
指定したcontrollerを一番上に表示する。
------------------------------------
FlipsideViewController.h

23-25
@protocol FlipsideViewControllerDelegate;
protocolの宣言
- (void)flipsideViewControllerDidFinish:(FlipsideViewController *)controller;の定義を行う。実装は、MainViewController.m23-26

2010年8月4日水曜日

Day 2 Campfire ローカル環境で実行してみる

Day 1 のように解説がある訳ではないらしい。とりあえず、ソースをダンロードして解析してみる。
いつものように、シミュレータのバージョンを変更する。warningが1つ出るが、実行は出来た。
キャンプファイヤーがめらめらしている画像が表示される。右下の「i」ボタンを押すと、くるっと画面が回転する。今度は右上の「Done」ボタンを押すとキャンプファイヤーの画面に戻る。

こういった動作をするアプリをUtilityアプリケーションと言うらしく、テンプレートも用意されている。と、言う訳でDay 2 はUtilityアプリケーションの作成らしい。
しかし、xcode3.xになって、Utility Applicationテンプレートの内容が変わった。
なので、新しいテンプレートに合わせてDay2を作り直してみる。
次回から、新しいUtility Applicationテンプレートのソースコードを解析してみる。

2010年8月3日火曜日

Day 1 解説を読んでつまずいた箇所まとめ

つまずいたその1
InterFace Builderの使い方が解らなくて説明についていけなかったのは、以下の3箇所。内容の概略を以下にメモする。

We need to reference the label in our code so we can update the label
Interfacce Builder(IB)を使って、labelを追加する所で、Xcodeのバージョンアップにより説明のようには"Class Outlets"がなかった。

xcode3では、ライブラリウィンドウに移っていた。




















--------------------------
Now we need to update our class file
Outletsを追加したので、クラスファイルを更新する。既にファイルを更新していた場合、上書きされてしまうのでFileMergeでMergeする。
--------------------------
Now we need to wire up the Label in Interface Builder to the UILabel in the class file
Interface Builderを使って、countdownLabelとFile's Ownerを接続する。

つまづいたその2
File'sOwnerとは、そもそもなんなのか?調べた。














Name→File's Owner
Type→MinutesToMidnightViewController
自動生成されたMinutesToMidnightViewControllerクラス。
MinutesToMidnightViewController.xibの持ち主がMinutesToMidnightViewControllerクラスである。

Name→View
Type→UIView
MinutesToMidnightViewControllerクラスのインスタンス変数View


つまづいたその3
各処理について簡単にしか説明がなかったので、より詳しく、どんな処理をしているのか調べた。

MinutesToMidnightAppDelegate.m
インスタンスメソッド
applicationDidFinishLaunching
処理内容は3つ
NSTimerクラスのscheduledTimerWithTimeIntervalで、1秒ごとに処理を行う。今回は、現在時刻の表示。
UIWindowクラスのaddSubviewで、ウィンドウの中にviewを渡す。
UIWindowクラスのmakeKeyAndVisibleで、キーウィンドウを作成する。

インスタンスメソッド
applicationWillTerminate
アプリが終了するときに呼ばれる