よくわかるiPhoneアプリ開発の教科書【Xcode 4対応版】
Xcode 4.2に関する補足情報(2011/10/26)

本書は、Xcode 4.0を使った解説になっていますが、Xcode 4.2でもほぼそのまま使えます。ただ、若干の違いがありますので以下の3項目に分けて説明します。

A)Xcode 4.2で変わったところについて
B)本書のサンプルファイルをXcode 4.2で読み込むとき
C)本書の手順でXcode 4.2で作る際の注意点について

A)Xcode 4.2で変わったところについて

まずは、Xcode 4.2になって大きく変わったところについて説明します。

1)新規プロジェクトのテンプレートの名称が変わりました。

アイコンや名称がリニューアルしましたが、基本的は同じです。新しくなったテンプレートを選択して始めましょう。

   ↓

2)オブジェクトライブラリが少し変わりました。

Stepper、Gesture Recognizerなどが増えました。

見た目は少し変わりましたが、これまでのものはそのまま使えるので問題ありません。

3)Automatic Reference Counter(ARC)機能が増えました。

今までややこしかったメモリ管理をかしこく行ってくれるうれしい新機能です。
Xcodeがソースファイルを見て必要なところに自動でreleaseを入れてコンパイルしてくれるようになったので、プログラマーはreleaseを書かなくてよくなりました。というよりもむしろ、書いてしまうと2重に入ることになるため、書いてはいけなくなりました。

新規プロジェクトのダイアログで、ARCのチェックをOFFにしてからプロジェクトを始めれば、これまでと同じ方法で実行することができます。

また、すでにARCをONにして作ってしまったプロジェクトでも、「Build Setting」タブの「Apple LLVM compiler 3.0」>「Objective-C Automatic Reference Counting」を「No」に設定すれば、これまでと同じ方法で実行することができます。

4)StoryBoard機能が増えました。

XIBが進化したもので、一度に複数の画面を作れるようになりました。

また、ボタンを押して別の画面に切り替える画面遷移を、ドラッグするだけでプログラムなしで作れます。これで、複数画面を切り換えるアプリが作りやすくなりました。

この機能を使うときは、xibファイルではなく、storyboardファイルになります。

新規プロジェクトのダイアログで、「Use Storyboard」のチェックをOFFにしてからプロジェクトを始めれば、これまでと同じ方法で実行することができます。

5)iPhoneとiPadを同時に画面設計できるようになりました。

新規プロジェクトのダイアログの「Device Family」で「Universal」を選択してから始めると、iPhoneとiPadの両方のxibファイル(または、storyboardファイル)が作られた状態で開始します。

iPhoneアプリだけ(またはiPadだけ)の開発をするときは、iPhone(またはiPad)を選択しておくと、これまで通りxibファイル(または、storyboardファイル)が1つになります。

B)本書のサンプルファイルをXcode 4.2で読み込むとき

※本書のサンプルファイルをXcode 4.2で読み込むと警告が現れますが、ほぼそのまま使えますし、設定を変えることで警告も消せます。

1)サンプルファイルを読み込むと、「Project !1」という警告が出ます。これは
「コンパイラの設定が古いので、新しいのにアップグレードしておくほうがいいですよ」
という警告です。

2)このままでも特に問題なくアプリを作ることはできますが、すぐに設定を新しくすることもできます。
「Project !1」をクリックすると、左側に「Validate Project Settings Update to recommended settings」と現れるのでクリックします。

3)すると、「コンパイラの設定を推奨設定にアップグレードしますか」、というダイアログが現れるので、「Perform Changes(変更を実行する)」をクリックします。

4)「この変更作業のスナップショットを取っておきますか?」というダイアログが現れるので「Enable」をクリックすると、変更が実行され、サンプルファイルから警告が表示されなくなります(「File > Restore snapshot」で元に戻せます)。


CHAPTER 10-1【Table View】 は、もう一つ警告が出ますが、
これは「initWithFrame: reuseIdentifier: という命令は古くなったので、別の方法で作って下さい」という警告です。

これは、以下のように修正することで、警告がなくなります。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];

if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

に変更してください。

C)本書の手順でXcode 4.2で作る際の注意点について

※基本的には、以下の2点について気をつければ、本書の手順のままで作れます。

CHAPTER 4-3, 5-1,5-2, 5-3, 5-4, 5-5, 5-6, 5-7, 5-8, 5-9, 6-1, 6-2, 6-3, 6-4, 7-1, 7-2, 7-3, 7-4, 8-1, 8-2, 8-3, 8-4

PRACTICEの[1]
[View-based Application]を選択します。

[Single View Application]を選択します。

PRACTICEの[1]
「Next」ボタンを押して保存します。

「Device Family」で「iPhone」を選択して、「Use Storyboard」と「Use Automatic Reference Counting」のチェックボックスをOFFにしてから、「Next」ボタンを押して保存します。

※すでにARCにチェックをONにして作ったプロジェクトでARCをOFFにするには、Build Settingで設定を切り換えます。

1)プロジェクトを開きます。
2)一番左のナビゲータエリアから、一番上にある青色のプロジェクトファイルを選択します。
3)右に現れる画面から「Build Setting」タブを選択し、「Apple LLVM compiler 3.0」の「Objective-C Automatic Reference Counting」の「YES」を「No」に切り換えてください。(たくさんあるので、Referenceで検索するとすぐ見つかります。)

これでこれまで通り、releaseを書く方法で作ることができるようになります。

CHAPTER 9-1 【Utility Application】

※xibのファイル名が変わりました。

PRACTICE[1]
「Next」ボタンを押して保存します。

「Device Family」で「iPhone」を選択して、「Use Storyboard」と「Use Automatic Reference Counting」のチェックボックスをOFFにしてから、「Next」ボタンを押して保存します。

PRACTICE[2]
「MainView.xib」をクリックしましょう。

「MainViewController.xib」をクリックしましょう。

PRACTICE[6]
「FlipsideView.xib」をクリックしましょう。

「FlipsideViewController.xib」をクリックしましょう。

PRACTICE[11]
[controller release];

削除します。

CHAPTER 9-2 【Tab Bar Application】

※xibのファイル名と、AppDelegateのファイル名が変わりました。

PRACTICE[1]
「Tab Bar Application」を選択します。

「Tabbed Application」を選択します。

PRACTICE[1]
「Next」ボタンを押して保存します。

「Device Family」で「iPhone」を選択して、「Use Storyboard」と「Use Automatic Reference Counting」のチェックボックスをOFFにしてから、「Next」ボタンを押して保存します。

PRACTICE[2]
「FirstView.xib」をクリックすると、

「FirstViewController.xib」をクリックすると、

PRACTICE[5]
「SecondView.xib」をクリックすると、

「SecondViewController.xib」をクリックすると、

PRACTICE[10],[11]
「tabBarTestAppDelegate.h」をインポートします。

「AppDelegate.h」をインポートします。

#import "tabBarAppDelegate.h"

#import "AppDelegate.h"

tabBarAppDelegate *appDelegate = (tabBarAppDelegate *) [[UIApplication sharedApplication] delegate];

AppDelegate *appDelegate = (AppDelegate *) [[UIApplication sharedApplication] delegate];

P275
PRACTICE[5],[6]の手順は全て削除で、以下の手順に変更します。

PRACTICE[5] AppDelegate.mにタブバーに新しく作った画面を追加するプログラムを記述します。「AppDelegate.m」ファイルを選択します。

1)
#import "SecondViewController.h" の次の行に

#import "myViewController.h"

を追加します。

2)
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:
の中の
UIViewController *viewController2 = [[[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil] autorelease];
の次の行に、

UIViewController *viewController3 = [[[myViewController alloc] initWithNibName:@"myViewController" bundle:nil] autorelease];

を追加します。

3)
self.tabBarController.viewControllers = [NSArray arrayWithObjects:viewController1, viewController2, nil];

self.tabBarController.viewControllers = [NSArray arrayWithObjects:viewController1, viewController2, viewController3, nil];

に修正します。

PRACTICE[6] myViewController.mに、タブバーボタンに文字を表示するプログラムを記述します。「myViewController.m」ファイルを選択します。

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNilの中の
if (self) {
}
の部分を、

if (self) {
   self.title = NSLocalizedString(@"Third", @"Third");
}

と変更します。

CHAPTER 10-1 【Table View】

※cellを作る記述方法が変わりました。

PRACTICE[1]
[View-based Application]を選択します。

[Single View Application]を選択します。

PRACTICE[1]
「Next」ボタンを押して保存します。

「Device Family」で「iPhone」を選択して、「Use Storyboard」と「Use Automatic Reference Counting」のチェックボックスをOFFにしてから、「Next」ボタンを押して保存します。

PRACTICE[6]
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];

if (cell == nil) {
   cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
に修正

P290
※メインのファイル名がMasterViewControllerに変わりました。

PRACTICE[1]
[Navigation-based Application]を選択します。

[Master-Detail Application]を選択します。

PRACTICE[1]
「Next」ボタンを押して保存します。

「Device Family」で「iPhone」を選択して、「Use Storyboard」と「Use Automatic Reference Counting」のチェックボックスをOFFにしてから、「Next」ボタンを押して保存します。

PRACTICE[2]
「.h」ファイル(RootViewController.h)を選択します。

「.h」ファイル(MasterViewController.h)を選択します。

@interface RootViewController : UITableViewController

@interface MasterViewController : UITableViewController

PRACTICE[3]
「.m」ファイル(RootViewController.m)を選択して、

「.m」ファイル(MasterViewController.h)を選択して、

CHAPTER 10-2 【Navigation-Based Application】

※cellを作る記述方法が変わり、下層画面が最初から用意されるようになりました。

PRACTICE[1]
[Navigation-based Application]を選択します。

[Master-Detail Application]を選択します。

PRACTICE[1]
「Next」ボタンを押して保存します。

「Device Family」で「iPhone」を選択して、「Use Storyboard」と「Use Automatic Reference Counting」のチェックボックスをOFFにしてから、「Next」ボタンを押して保存します。

PRACTICE[2]の手順は削除。

Master-Detail Applicationになって、最初から下層画面が用意されるようになったので、自分で作らなくて良くなりました。
下層画面の名前は「DetailViewController」です。

PRACTICE[3]
「myViewContoller.xib」をクリックして

「DetailViewController.xib」をクリックして

PRACTICE[4]
「.h」ファイル(myViewContoller.h)を選択します。

「.h」ファイル(DetailViewController.h)を選択します。

PRACTICE[6]
「.m」ファイル(myViewContoller.m)を選択します。

「.m」ファイル(DetailViewController.m)を選択します。

PRACTICE[7]
「.h」ファイル(RootViewController.h)を選択します。

「.h」ファイル(MasterViewController.h)を選択します。

PRACTICE[8]の手順は削除。すでにインポートされています。

PRACTICE[9]
「.m」ファイル(RootViewController.m)を選択します。

「.m」ファイル(MasterViewController.m)を選択します。

PRACTICE[11]
myViewController *detailViewController = [[myViewController alloc] initWithNibName:@"myViewController" bundle:nil];
detailViewController.dispStr = [myData objectAtIndex:indexPath.row];

self.detailViewController = [[[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil] autorelease];
self.detailViewController.dispStr = [myData objectAtIndex:indexPath.row];

CHAPTER 10-3 【Cellカスタマイズ】

※cellを作る記述方法が変わり、下層画面が最初から用意されるようになりました。

PRACTICE[1]
[Navigation-based Application]を選択します。

[Master-Detail Application]を選択します。

PRACTICE[1]
「Next」ボタンを押して保存します。

「Device Family」で「iPhone」を選択して、「Use Storyboard」と「Use Automatic Reference Counting」のチェックボックスをOFFにしてから、「Next」ボタンを押して保存します。

PRACTICE[5]
そして、[File's Owner」を右クリックして(またh、contorl+クリック)し、[View]の右にある[○]をドラッグして「My Cell View Controller」にドラッグすると、自作セルと自作セルクラスの接続ができます。

削除します。(4.2ではviewが出なくなったので、セルを直接指定するプログラム方法で行います。)

PRACTICE[7]
ルート画面(RootViewController.h)で、

ルート画面(MasterViewController.h)で、

PRACTICE[7]
if (cell == nil) {
   UIViewController *vc;
   vc = [[UIViewController alloc] initWithNibName:@"myCell" bundle:nil];
   cell = (myCellViewController *)vc.view;
}

if (cell == nil) {
   UINib *nib = [UINib nibWithNibName:@"myCell" bundle:nil];
   NSArray* array = [nib instantiateWithOwner:nil options:nil];
   cell = [array objectAtIndex:0];

}