ラベル tutorial の投稿を表示しています。 すべての投稿を表示
ラベル tutorial の投稿を表示しています。 すべての投稿を表示

2010年9月22日水曜日

Day6 Reaction Time(3)信号機画像を追加する

信号機ケーブル画像を追加する
画像をプログラミングで、表示したい位置に追加するために以下のように実装した。

UIImage* stopLightCableImage = [UIImage imageNamed:@"stopLightCable.png"];
UIImageView* stopLightCableView = [[UIImageView alloc] initWithImage:stopLightCableImage];
stopLightCableView.frame = CGRectMake(150, 0, stopLightCableImage.size.width, stopLightCableImage.size.height);
stopLightCableView.image = stopLightCableImage;
[self.view addSubview:stopLightCableView];

2行目
initWithImage メソッドで指定した画像で初期化する。

3行目
UIImageView の frame メソッドで表示位置を指定する。
→ bounds メソッドでは、stopLightCableView の、ローカルな座標の指定になるので間違い。frame メソッドで、親Viewから見た座標で位置を指定する。


4行目
image プロパティに画像を指定する。

信号機画像3種類をランダムに表示させるメソッドを実装する

以下の内容を訂正する。これではやりたかったことが実現できないので。。
訂正ここから-----------------------------------
以下のように実装した。
-(NSArray *)makeAnimationImagesArray{

NSMutableArray* trafficLightArray = [NSMutableArray arrayWithObjects:
[UIImage imageNamed:@"redLightSmall.png"],
[UIImage imageNamed:@"yellowLightSmall.png"],
[UIImage imageNamed:@"greenLightSmall.png"], nil];

int count = [trafficLightArray count];
srand([[NSDate date] timeIntervalSinceReferenceDate]);

int i = 0;
for(i=0; i<10; i++){
NSUInteger pos1 = rand() % count;
NSUInteger pos2 = rand() % count;

[trafficLightArray exchangeObjectAtIndex:pos1 withObjectAtIndex:pos2];
}

return(trafficLightArray);
}
9行目擬似乱数の発生系列を変更する種を、現在時刻から生成する。
10行目〜0〜2をランダムに生成する。訂正ここまで-----------------------------------


改めて、信号機画像3種類を表示させる
次のメソッドを使用して、現行ループにタイマーとスケジュールを作成する。
scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:
Creates and returns a new NSTimer object and schedules it on the current run loop in the default mode.
このメソッドで、3種類の画像(黄→赤→緑)を3秒おきに表示させる。
アクセルペダルをタップした時の動作を実装する事前にフラグを持たせておいて、緑色画像が表示されたらフラグをONにする。また、その時の時刻を取得しておく。
次のメソッドを使用して、緑色画像が表示された時刻と、現在時刻の差を取得する。
timeIntervalSinceNow
Returns the interval between the receiver and the current date and time.

結果をUIAlertView で画面に表示する。

2010年9月17日金曜日

Day6 Reaction Time(2)view に背景画像を追加する

背景画像として、road.png をview に追加する。
road.png をResources フォルダに追加して、以下のように実装した。

- (void)viewDidLoad {
[super viewDidLoad];

UIImage* backgroundImage = [UIImage imageNamed:@"road.png"];
UIImageView* backgroundView = [[UIImageView alloc] initWithImage:backgroundImage];
[backgroundView setFrame:[[UIScreen mainScreen] bounds]];
[self.view addSubview:backgroundView];

[backgroundView release];
}

参考にしたのは以下の箇所。
How do I create a view for images?
To create a view for images, use the UIImageView class, as shown in Listing 14.

Listing 14: Creating a view for images
UIImage *image = [UIImage imageNamed:@"image.png"];
UIImageView *theImageView = [[UIImageView alloc] initWithImage:image];
さらに、UIImageView を setFrame メソッドで画面全体に表示させて、view に追加している。

参考サイト:

User Experiense Coding How-To's

Day6 Reaction Time(1)画面構成

Reaction Time アプリの内容はこんな感じか。

アプリの内容
画面中央に表示されている信号が青に変わったら、右下にあるアクセルペダル画像をタップすると、何ミリ秒で反応したかが表示される。
---------------------------------------
画像の配置
使用されている画像は次の4つ。
1.
道路(road.png)
背景画像として、view に追加する。

2-1.
信号機(redLightSmall.png、yellowLightSmall.png、greenLightSmall.png)
3つの画像をランダムに表示させている。

2-2.
信号機を上部から支えている線(stopLightCable.png)
細部も抜かりありませんね。

3.
アクセルペダル(gasPedalSmall.png)
コレをタップすると、信号が青に変わってからタップされるまでの経過時間が画面に表示される。
---------------------------------------
Alert メッセージの表示
次の状態の時、Alert メッセージを表示する。
1.
アプリを起動させた直後
操作方法を説明する。

2.
信号が青に変わってからペダルをタップした時
信号が青に変わってからタップされるまでの経過時間を表示する。

3.
信号が赤、または黄色でペダルをタップした時
「青信号でタップしろ」と警告する。

2010年9月16日木曜日

Day5 Count Me In

アプリの内容:
「+」ボタンと「ー」ボタン、数字が表示されたラベルが用意されている。
1回押すごとにラベルに表示された数字がインクリメント/デクリメントする。

実装:
View にUIButton とUILabel を追加する。
UILabel に表示する数字をインクリメント/デクリメントするメソッドを実装する。

ボタンアクション:
addTarget:action:forControlEvents: で、アクションとターゲットを追加する。
addTarget:action:forControlEvents:
Adds a target and action for a particular event (or events) to an internal dispatch table.

Control Events には、様々なイベントが用意されている。
今回の「ボタンを押す」アクションは、「UIControlEventTouchUpInside」を選択する。
UIControlEventTouchUpInside
A touch-up event in the control where the finger is inside the bounds of the control.

最初、特に理由もなく「UIControlEventAllEvents」を選択していたら、なぜかアクションに指定したメソッドが2回呼ばれてしまった。レファレンスを読むと、
UIControlEventAllEvents
All events, including system events.

と、あるのでシステムイベントでも呼ばれていたのだと思う。適当に選択するのはやめろ。

UILabel に表示する数字をインクリメント/デクリメントするメソッド:

以下のように実装した。

-(void)addUnit{
NSString* numValue = [[NSString alloc] initWithFormat:@"%d", ++count];

contLabel.text = numValue;
[numValue release];
}

-(void)subtractUnit{
if(count <= 0) return;
NSString* numValue = [[NSString alloc] initWithFormat:@"%d", --count];

contLabel.text = numValue;
[numValue release];
}
チュートリアルでは、インクリメント/デクリメント演算子が後置されていたが、それではボタンを1回押しただけでは目的が達成されないので前値に直した。
インクリメントC言語、C++、Java、JavaScriptなどでは、インクリメント演算子「++」が用意されている。厳密には、前置インクリメントと後置インクリメントの2種類の演算子があり、演算子記号は同じ「++」だがオペランドの前に置くか(例: ++x)後に置くか(例: x++)で区別される。前置インクリメントは式の評価の最初にオペランドがインクリメントされ、後置インクリメントは最後にインクリメントされる。
参考サイト:UIControl Class Refarence 、インクリメント

2010年9月10日金曜日

Day 3 OpenURL openMaps: カスタマイズ(2)キーボードを表示/非表示にする

以下のことを実装したい。
-------------------------
1.
テキストフィールドをタップしたときにキーボードを表示し、ユーザーがキーボードの「Done」ボタンをタップしたときにキーボードを非表示にする。
2.
テキストフィールドの下にある「openMaps」ボタンをタップすると、googleMapsが開き、テキストフィールドに入力した場所の地図が表示される。
-------------------------

UITextFieldDelegateプロトコルには、ユーザが「Return」ボタンをタップしたときにテキストフィールドを呼び出す(ボタンに表示されるテキストがどのようなものであっても)、textFieldShouldReturn:メソッドが含まれています。

textFieldShouldReturn:
Asks the delegate if the text field should process the pressing of the return button.

View Controllerはテキストフィールドのデリゲートとして設定したため、このメソッドを実装して、resignFirstResponderメッセージを送信する(キーボードを閉じる効果を持つ)ことによって、テキストフィールドからファーストレスポンダステータスを強制的になくすことができます。

resignFirstResponder
Notifies the receiver that it has been asked to relinquish its status as first responder in its window.

これを元に実装したソースは以下の通り。
-(BOOL)textFieldShouldReturn:(UITextField *)tf{

[tf resignFirstResponder];

return YES;
}

テキストフィールドに入力された文字を openMaps: メソッドに渡し、openURL でgoogleMapsを実行する処理は以下のように実装した。

-(void)openMaps:(id)sender {

self.addString = txtField.text;
NSString* addressText =self.addString;

addressText = [addressText stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
NSString* urlText = [NSString stringWithFormat:@"http://maps.google.com/maps?q=%@",addressText];

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlText]];

[addString release];

}
シミュレーターには日本語キーボードがないようなので、日本語入力を試すことが出来なかった。

参考PDF:
iPhone アプリケーション チュートリアル

Day 3 OpenURL openMaps: カスタマイズ(1)住所を直接入力する

ボタンをタップして決めうちの住所をgoogleMapsで表示するのではなく、テキストフィールドを実装してキーボードから住所を入力できるようにカスタマイズする。

UIKitフレームワークには、テキストコンテンツを表示するために、次の3つの主要なクラスがあります。
■ UILabel:静的なテキスト文字列を表示する
■ UITextField:編集可能な単一行のテキストを表示する
■ UITextView:編集可能な複数行のテキストを表示する

住所は1行程度の入力になると想定して、UITextFieldクラスを利用する。

編集可能なText Viewで作業をする場合は、常に、編集セッションを管理するデリゲートオブジェクトを提供する必要があります。
View Controllerは、それ自体がこのテキストフィールドのデリゲートになるため、UITextFieldDelegateプロトコルを採用しなければなりません。クラスがプロトコルを採用することを指定するには、インターフェイスで、そのクラスの継承元のクラスの名前の後に、角括弧(<>)で囲んでプロトコル名を追加します。

TextField を実装するソースコードは以下のようにした。

インターフェイスで、デリゲートを設定する。
RootViewController.h
#import <UIKit/UIKit.h>

@interface RootViewController : UIViewController <UITextFieldDelegate> {
UIView *view;
UITextField *txtField;
}
@end

TextField の実装は、loadView メソッドで行う。
デフォルトの画面 UIView に、テキストフィールドのビュー UITxetField を追加する。

RootViewController.m

-(void)loadView{

view = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
view.backgroundColor = [UIColor grayColor];
self.view = view;

txtField = [[UITextField alloc] initWithFrame:CGRectMake(63, 56, 200, 30)];
txtField.borderStyle = 3;
txtField.placeholder = @"Enter Adress";
[self.view addSubview: txtField];
txtField.delegate = self;
txtField.returnKeyType = UIReturnKeyDone;

[txtField release];
[view release];

}

参考PDF:iPhone アプリケーションプログラミングガイド
iPhone アプリケーション チュートリアル

2010年9月7日火曜日

Day 3 OpenURL openMaps: メソッド詳細(2)

元の実装では、決め打ちで住所を指定していた(米国appleの住所、アルファベットと数字)。コレを日本語で指定したい(日本apple本社の住所)場合はstringWithCString:encoding: メソッドを使用する。
stringWithCString:encoding:
Returns a string containing the bytes in a given C array, interpreted according to a given encoding.

C言語の文字列からNSStringを返すメソッド。文字列は「" "」で囲む。エンコーディングの引数は「NSUTF8StringEncoding」を指定する。
日本語住所を指定する場合のソースは以下のようになる。
-(void)openMaps:(id)sender{
NSString* addressText =[NSString stringWithCString:"東京都新宿区西新宿3-20-2" encoding:NSUTF8StringEncoding];

addressText = [addressText stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

NSString* urlText = [NSString stringWithFormat:@"http://maps.google.com/maps?q=%@",addressText];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlText]];
}

Day 3 OpenURL openMaps: メソッド詳細(1)

openMaps ボダンをクリックすると実行される処理の内容を説明する。

ソースコードは以下の通り。

-(void)openMaps:(id)sender{
NSString* addressText = @"1 Infinite Loop, Cupertino, CA 95014";

addressText = [addressText stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];

NSString* urlText = [NSString stringWithFormat:@"http://maps.google.com/maps?q=%@",addressText];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlText]];
}

4行目
決め打ちの住所(米国appleの住所)をstringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding メソッドでエンコードする。
6行目
stringWithFormat メソッドで、文字列(googleMap検索のURL)を作る。
7行目
URLWithString メソッドで、NSURLを作成する。そのNSURL を利用してgoogleMapでその住所を表示する。

6行目補足
作成する文字列は、googleMapで検索した結果を表示するURL

7行目補足
sharedApplicationメソッドでインスタンスを取得して、openURL メソッドでアプリケーション(googleMaps)にアクセスする。

2010年9月6日月曜日

Day 3 OpenURL ローカル環境で実行してみる

アプリを実行してみると以下の5つのボタンが並んでいる。
 Open phone URL
 Open SMS URL
 Open E-mail URL
 Open Map URL
 Open Browser URL

ソースコードを見ると、ボタンをタップして実行されるコードを書いているのは「Open Map URL」だけなのでそこだけ実装してみる。
ここで使われているのはカスタムURLと言われるもの。iPhoneAppProgramingGuide.pdf より引用。
アプリケーションが既知の型のURLを扱う場合は、そのURLスキームを使用してそのアプリケーションとやり取りができます。
使うメソッドは、openURL:メソッド。
詳細は以降。

参考PDF:iPhone アプリケーションプログラミングガイド 他のアプリケーションとのやり取り

2010年9月1日水曜日

Day 2 画像をアニメーション表示させる

UIImageViewクラスを利用して画像をアニメーション表示させる。
viewDidLoadに以下で実装した処理を追加する。
実装手順は以下の通り。

1.
animationImagesプロパティに、アニメーションで使われる画像を格納した配列を指定する。最後に nil を入れるのを忘れない。

2.
アニメーションの設定を下記のプロパティで指定する。
animationDurationプロパティで、アニメーションの時間を指定する。
animationRepeatCountプロパティで、アニメーションを繰り返す回数を指定する。

3.
startAnimatingメソッドで、アニメーションを開始する。

4.
現在のviewにUIImageViewを追加する。

Day 2 modalビューを表示させる

modalビューを表示させるために、mainviewの右下隅にあるinfoボタンを実装する。
参考にしたのは参照PDFの「モーダルモードでのNavigationControllerの表示」。

-(void)showInfo:(id)sender{

RootViewController *rootView = [[RootViewController alloc] init];
FlipsideViewController *modalview = [[FlipsideViewController alloc] init];
modalview.delegate = self;
modalview.view.backgroundColor = [UIColor greenColor];

UINavigationController *naviModalController = [[UINavigationController alloc] initWithRootViewController:rootView];

modalview.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[naviModalController pushViewController:modalview animated:NO];
[self presentModalViewController:naviModalController animated:YES];

[rootView release];
[modalview release];
[naviModalController release];

}

5行目
delegateプロパティを設定して、modalを閉じるメソッドをデリゲーションするときに使用する。

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

2010年8月31日火曜日

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

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

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

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

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

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
アプリが終了するときに呼ばれる



2010年7月27日火曜日

Day 1 エラーの原因と正しい処理の内容

updateLabelクラスを、beforeからafterに書き換えたところ、エラーがなくなりシミュレータが動いた。

before
-(void)updateLabel {
NSDate* now = [NSDate date];
int hour = 23 - [[now dateWithCalendarFormat:nil timeZone:nil] hourOfDay];
int min = 59 - [[now dateWithCalendarFormat:nil timeZone:nil] minuteOfHour];
int sec = 59 - [[now dateWithCalendarFormat:nil timeZone:nil] secondOfMinute];
countdownLabel.text = [NSString stringWithFormat:@"%02d:%02d:%02d", hour, min,sec];
}

updateLabelクラスでは、ラベルに表示する時刻を生成している。
beforeでエラーが出るのは次の3行。
1: int hour = 23 - [[now dateWithCalendarFormat:nil timeZone:nil] hourOfDay];
2: int min = 59 - [[now dateWithCalendarFormat:nil timeZone:nil] minuteOfHour];
3: int sec = 59 - [[now dateWithCalendarFormat:nil timeZone:nil] secondOfMinute];

after
-(void)updateLabel {
NSDate* now = [NSDate date];
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *dateComponents = [gregorian components:(NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit) fromDate:now];
NSInteger hour = [dateComponents hour];
NSInteger minute = [dateComponents minute];
NSInteger second = [dateComponents second];
[gregorian release];
countdownLabel.text = [NSString stringWithFormat:@"%02d:%02d:%02d", hour, minute, second];
}

正しく動作する、updateLabelクラスの主な処理は以下の通り。
---------------------------
NSDate* now = [NSDate date];
NSDateクラスブジェクトを生成する
dateメソッドで、現在の日時(経過時間)を取得する

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSCalendarクラスオブジェクトの生成と初期化を行う
initWithCalendarIdentifierメソッドは、NSString型の引数をとる。
引数は、NSLocaleクラスのNSLocale Calendar Keysで定義されている。
NSGregorianCalendarは、グレゴリオ暦を指定している。

NSDateComponents *dateComponents = [gregorian components:(NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit) fromDate:now];
NSDateComponentsクラスオブジェクトの生成を行う。
NSDateComponentsクラスは、カレンダーの年、月、日、時、分、秒、曜日を保持する。
オブジェクトの取得は、NSCalendarクラスのcomponentsメソッドを使用する。
componentsメソッドの引数は2つ。ひとつめは、Calendar Units。取得したいデータ(今回だと、時、分、秒)のこと。
ふたつめは、現在の日時(取得済み)。

形成されたNSDateComponentsから時、分、秒を取り出す。

Calendar Unitsで取得したいデータが複数ある場合は、論理和で指定する。

2010年7月24日土曜日

appsamuck.com / Day 1 Minutes to Midnight ローカル環境で実行してみる

appsamuck.com というサイトで、iPhoneアプリのチュートリアルが紹介されていた(Zipソース付き)。
実際にひとつずつ挑戦してみたいと思う。まずは、Day 1から。これは、時計アプリのようだ。説明にそってローカル環境で手を動かして作ってみた。
…………。



『アウトレット』のあたりでつまずいた。
iPhoneやCocoaに関する知識はもちろん、Objective-Cも初心者。なので、、、
ZipをダウンロードしてXcodeで『ビルドと実行』してみた。
…………。
エラー。。。。
以下の解決法2つを実行後、無事にローカル環境のエミュレータ上でアプリが動いた。

Zipソースを解凍して、Xcodeで開く。『ビルドと実行』をクリック。
→ 結果:There is no SDK with the name or path 'iphoneos2.0' とエラーが出る。


解決方法1:


プロジェクト>プロジェクト設定を編集>「一般」タブで、「全ての構成のベース SDK:」のプルダウンメニューから
『iPhone デバイス 4.0』を選択する。その後、Xcodeを再起動する。

もう一度、『ビルドと実行』をクリック。
→ 結果:MinutesToMidnightViewController.mの44.45.46行目に、 error: invalid operands to binary - (have 'int' and 'id') とエラーが出る。

解決方法2:
Objective-Cが分からないので、googleで検索して英語サイトに載っていた解決方法をそのままコピペ。

以上の方法で、Day 1 は動いた。次回、エラーが出た部分のソース解析をしたいと思う。