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

2009/07/23

iPhoneアプリ作成:テーブルビューセルのサンプルアプリが落ちる

SoftBank Creativeの「はじめてのiPhoneプログラミング」のサンプルアプリを作成しながら悩んだことのメモです。

いろいろ悩んでます。


P.223「UITableViewCellのカスタムサブクラス」から始まるサンプルの作成で、Cellsアプリが実行時に不正に終了してしまい困りました。

ブレークしながら実行すると、以前悩んだときと同じように"EXC_BAD_INSTRUCTION"と表示されます。


この本のサイトから取得したサンプルソースを参照したところ、iPhone SDK 2.1以上を使用している場合に変えなければならない所があるみたいです。
Jeff and Dave's Excellent iPhone Support Page


- tableView:cellForRowAtIndexPathメソッドにおいて、本の文中では次のようにあります。
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil];
cell = [nib objectAtIndex:1];


これの[nib objectAtIndex:1]としている箇所を次のように[nib objectAtIndex:0]にしなければならないようです。

NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil];
cell = [nib objectAtIndex:0];



サンプルソースでは、コメントで次のように記述されています。
The behavior here changed between SDK 2.0 and 2.1. In 2.1+, loadNibNamed:owner:options: does not include an entry in the array for File's Owner. In 2.0, it does.




難しいです。

iPhoneアプリ作成:UITableViewCell で「warning: 'setText:' is deprecated」

SoftBank Creativeの「はじめてのiPhoneプログラミング」のサンプルアプリを作成しながら悩んだことのメモです。

ちびちびとやってます。


iPhone SDK 3.0 を使用したビルド環境でテーブルビューを使うサンプルアプリを作成すると、警告が出てしまうところがあります。

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:SimpleTableIdentifier];

〜省略〜

NSUInteger row = [indexPath row];
cell.text = [listData objectAtIndex:row];

上記のコードのうち、
cell.text = [listData objectAtIndex:row];
で次のような警告が出ます。
warning: 'setText:' is deprecated



UITableViewCellクラスのドキュメントを見ると下記のようにあります。
text

The text of the cell. (Deprecated. Use the textLabel and detailTextLabel properties instead.)


ネットで調べたところiPhone SDK 3.0で"Deprecated"になったようです。


どのように変更するのがいいのかAppleのiPhone Reference Libraryで検索してみたところ、次のようにしているサンプルコードがありました。
UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:@"CellWithSwitch"];

〜 省略 〜

cell.textLabel.text = @"Sound Effects";


これにならい次のように変更したところ、警告が出なくなったようです。
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:SimpleTableIdentifier];

〜省略〜

NSUInteger row = [indexPath row];
// cell.text = [listData objectAtIndex:row];
cell.textLabel.text = [listData objectAtIndex:row];



ビルド後に実行してみても意図した通りの動きをするようなので、大丈夫なんでしょう。
多分。

2009/07/19

iPhoneアプリ作成:Picker Viewがおかしなことに…

SoftBank Creativeの「はじめてのiPhoneプログラミング」のサンプルアプリを作成しながら悩んだことのメモです。

相変わらずよく分からずにやってます。

Picker Viewをつかったサンプルアプリの表示がおかしなことになってしまいました。
ピッカーの項目がビュー全体に広がってしまいました。


Picker Viewを使ったnibをInterface Builderで開き、File's Ownerを選択してコネクションインスペクタを開いたところ、アウトレットのところでviewがPickerに結びついてしまっています。


次のようにviewをViewに結びつけるように変更しました。



そしてビルドし直して実行します。



問題なくなったようです。



しかし、なんでこんなことに…。

iPhoneアプリのデバッグ中にEXC_BAD_INSTRUCTIONで落ちて困った

SoftBank Creativeの「はじめてのiPhoneプログラミング」のサンプルアプリを作成しながら悩んだことのメモです。

相変わらずマヌケなことやってます。


アプリの起動直後に異常終了してしまって困りました。

Xcodeのウィンドウの下の方には"EXC_BAD_INSTRUCTION"と表示されます。


デバッガの使い方もよく分かっていないのですが、デバッガでブレークポイントを設定してブレークしながら実行していると、"EXC_BAD_INSTRUCTION"表示されます。

ブレークしないで実行しても、アプリが落ちるだけでXcode側には特に何も表示されません。

まだまだ覚えなければならないことが多そうです。


"EXC_BAD_INSTRUCTION"についてですが、どうやらアウトレットの接続ミスのようです。

以下のサイトを参考にさせていただきました。
iPhone SDK APP STORE公開までのアプリ開発まとめ。遥か遠い環境設定と開発の道。


Xcodeでアウトレットを作成した際、アウトレット変数の名前をdatePickerとすべきところをdataPickerにしてしまいました。
IBOutlet  UIDatePicker  *dataPicker;


アウトレット変数の名前を間違えたままInterface Builderでアウトレットを使用してしまいました。



その後アウトレット変数の名前を間違えたことに気付き、Xcodeでソースは下記のように修正しました。
IBOutlet  UIDatePicker  *datePicker;


しかし、Interface Builderの方は修正をせず、悪いことに修正をしなくてもビルドが通ってしまい、実行時に"EXC_BAD_INSTRUCTION"のエラーが発生してしまったようです。


我ながらお恥ずかしい限りです。

2009/07/17

「はじめてのiPhoneプログラミング」の第5章「Swap」が実行時エラーになって困った

SoftBank Creativeの「はじめてのiPhoneプログラミング」のサンプルアプリを作りながら勉強しています。

「第5章 オートローテーションとオートサイジング」の後半で作っている「Swap」が実行時にエラーになってしまって困りました。

我ながらアホなことをやったみたいですが、どうやらP.118「2つのビューをデザインする」で作成する2つのビューの作り方が悪かったようです。

この書籍のネットで配布されているサンプルプログラムをダウンロードして、それを調べて気づいたのですが、PortraitとLandscapeのどちらのビューにも「view」アウトレットを結びつけていなかったのが原因のようです。


Portraitビューの方に以下のように「view」アウトレットを結びつけたら無事起動するようになりました。



本文中に下記のように記述されているところを間違えたみたいです。
では、File's OwnerアイコンからPortraitアイコンまでコントロール—ドラッグして、灰色のメニューがポップアップしたら、portraitアウトレットを選択します。それから、またFile's Ownerを今度はLandscapeアイコンにコントロ—ル—ドラッグして、Viewアウトレットを選択し、起動時にどちらのビューが表示されるかを指示します。