新MBPに乗り換え、xcode4+iOS4.3も正式リリースになったという事で移行した際にはまった事など。
・missing fileが出まくる
svnを使用していて、svn deleteせずにファイルだけ消えている状態になると出るっぽい。
ビルドには問題ないけどwarningが出まくってるのは気分的によろしくない。
該当ファイルをsvn deleteしてプロジェクトを開きなしたら治った。
・iOS4.3 simulatorでエラーが出る
ココとかココによると皆なってるっぽい。
実機の4.3では問題なく動作するので気にしない事にする。
xcode4 templateで改善したのかもしれない。
・Distribution
xcode4ではアプリケーションローダーが不要になり、xcode4内で完結出来るようになっている。
アップの仕方はココらへんを参考に。
cocos2dの旧プロジェクトをそのまま移行した場合、そのままではvalidateでエラーが出る。
メインプロジェクトとcocos2dのターゲット両方がインストールされる指定になっているので、プロジェクトツリーからプロジェクトを選択>TARGETSのcocos2d librariesを選択>Skil InstallをYESにする事で回避。
cocos2d xcode4 templateでは修正されてるのかな?
ついでにcocos2d 0.99.5であったBUG FIXを適応してアップ。
このバグ確認出来なかったけど、これでアプリケーションクラッシュが改善されるといいなぁ
・新MBP
なんかSSDが早く感じる。VAIOのSSD*4 RAIDと比べても遅いとか思わない。
プロジェクト内の文字列検索とかいつ検索したの?ってぐらい早い。
ビルドも早いんだけど、その分実機への転送が遅く感じる、特に3G世代(´・ω・`)
カスタム検索
2011年3月23日水曜日
2010年9月14日火曜日
iOS4.1の目玉(?)GameCenterを使ってみた・その1
iOS4.1がリリースされ、GameCenterが正式に稼働となりました。
あんまり期待してなかったのですが、なんだかドキュメントを読んでいたら意外におもしろそうな感じ。
単純なスコアランキングから、条件達成、自動対戦マッチにフレンド機能と、自前サーバいらずな感じになりそう。
(どうせならアイテム課金の管理もAppleでやってくれたら完璧なのに・・・)
ちょうどスコア系のゲームをつくっていたので慣れない英語を必死に読みながら実装してみた。
・iTunesConnectにアプリケーションを登録する
登録必須です、スクリーンショットとか検索キーワードとか先に入れるの面倒ですが、後から変更出来ますのでとりあえず作っちゃいましょう。
登録したら、Manage GameCenterから、GameCenter Testingを有効にする。
Leaderboard(ハイスコア)とAchievements(条件達成)がセットアップ出来るので設定しておく。
・プロジェクトの設定
対象のプロジェクトにGameKitをLinkする。
GameKit/GameKit.h をインポートする。
ビルトプロパティの識別子をアプリケーションで設定したものと同じにする。(jp.co.hoge.application)
・稼働しているデバイスがGameCenterに対応しているか調べる
サンプルコードの isGameCenterAvailable に該当
・ユーザを認証する
サンプルコードの authenticateLocalPlayer に該当
ゲーム中にバックグラウンドでログアウトしたりする可能性があるので、GameCenterでの処理を行う前には必ず行う。
・スコアの登録
サンプルコードの reportScore に該当
・ランキングの表示
一般的なGameCenter用の表示と、カスタムでスコアだけ取得して自分で描画するパターンがある。
統合されたインターフェースで十分だったので、一般的な表示を使おうと思ったんだけど、cocos2dだとここがちょっと面倒に。
GKLeaderboardViewControllerDelegate を持つ UIViewController クラスを作成して、CCDIrector の openGLView に addSubview して解決。(超適当)
詳しくはココらへんを参照
とりあえずこんだけでランキングに登録、表示が可能になりました。
フレンドとかはGameCenter側で出来る話なので気にすることもなし。
オンラインマッチに関してはエイバースの中の人が詳しく紹介されてます。
あれ、その1で完結しちゃった。
Achievements触ってみてなんかあれば続きでも・・・
あんまり期待してなかったのですが、なんだかドキュメントを読んでいたら意外におもしろそうな感じ。
単純なスコアランキングから、条件達成、自動対戦マッチにフレンド機能と、自前サーバいらずな感じになりそう。
(どうせならアイテム課金の管理もAppleでやってくれたら完璧なのに・・・)
ちょうどスコア系のゲームをつくっていたので慣れない英語を必死に読みながら実装してみた。
・iTunesConnectにアプリケーションを登録する
登録必須です、スクリーンショットとか検索キーワードとか先に入れるの面倒ですが、後から変更出来ますのでとりあえず作っちゃいましょう。
登録したら、Manage GameCenterから、GameCenter Testingを有効にする。
Leaderboard(ハイスコア)とAchievements(条件達成)がセットアップ出来るので設定しておく。
・プロジェクトの設定
対象のプロジェクトにGameKitをLinkする。
GameKit/GameKit.h をインポートする。
ビルトプロパティの識別子をアプリケーションで設定したものと同じにする。(jp.co.hoge.application)
・稼働しているデバイスがGameCenterに対応しているか調べる
サンプルコードの isGameCenterAvailable に該当
・ユーザを認証する
サンプルコードの authenticateLocalPlayer に該当
ゲーム中にバックグラウンドでログアウトしたりする可能性があるので、GameCenterでの処理を行う前には必ず行う。
・スコアの登録
サンプルコードの reportScore に該当
・ランキングの表示
一般的なGameCenter用の表示と、カスタムでスコアだけ取得して自分で描画するパターンがある。
統合されたインターフェースで十分だったので、一般的な表示を使おうと思ったんだけど、cocos2dだとここがちょっと面倒に。
GKLeaderboardViewControllerDelegate を持つ UIViewController クラスを作成して、CCDIrector の openGLView に addSubview して解決。(超適当)
詳しくはココらへんを参照
とりあえずこんだけでランキングに登録、表示が可能になりました。
フレンドとかはGameCenter側で出来る話なので気にすることもなし。
オンラインマッチに関してはエイバースの中の人が詳しく紹介されてます。
あれ、その1で完結しちゃった。
Achievements触ってみてなんかあれば続きでも・・・
2010年8月26日木曜日
cocos2dで日本語をCCBitmapFontAtlasで使うには
ちょっとはまったんでメモメモ
cocos2dでは文字の表示に CCLabel という簡単なものがあるのですが、これが結構な重い処理となります。
スムーズな動作を必要とするゲームなどでは、BitmapFontを使うと良いです。
(逆にADV系など速度を要求しないものであればCCLabelでおk)
現時点(cocos2d v0.99.4)では標準のままでは使えません。
公式フォーラムのコチラで問題点が指摘されています。
プロジェクト内の cocos2d Sources > cocos2d > CCBitmapFontAtlas.h を編集します。
kCCBitmapFontAtlasMaxChars = 2048
を
kCCBitmapFontAtlasMaxChars = 65536
に変更
BitmapFontを作る方法ですが、Hiero Font EditorというのとBMFontGeneratorというが推奨されているようです。
BMFontはWindowsでしか動かないので、とりあえずhieroを使ってみたんですが、どうもうちではうまく動作してくれませんでした。
(出力画像が天地左右反転されたり、出力対象がコピペできなかったり、一度出力すると変更して二度目の出力が出来なかったり)
なのでBMFontを使ったやり方を紹介します。
・必要な文字を含んだテキストファイルを作成(UTF-16で保存)
・Edit -> Select chars from file で上記ファイルを選択
・Export OptionsでBit depth を 32、png 出力
・Font Settingsで Font smoothing を選択
色などはお好みで、cocos2d側でも変更が効くので特に気にする必要もないと思います。
これで出力された .fnt ファイルを CCBitmapFontAtlas で読み込んでやればBitmapFontで描画されます。
cocos2dでは文字の表示に CCLabel という簡単なものがあるのですが、これが結構な重い処理となります。
スムーズな動作を必要とするゲームなどでは、BitmapFontを使うと良いです。
(逆にADV系など速度を要求しないものであればCCLabelでおk)
現時点(cocos2d v0.99.4)では標準のままでは使えません。
公式フォーラムのコチラで問題点が指摘されています。
プロジェクト内の cocos2d Sources > cocos2d > CCBitmapFontAtlas.h を編集します。
kCCBitmapFontAtlasMaxChars = 2048
を
kCCBitmapFontAtlasMaxChars = 65536
に変更
BitmapFontを作る方法ですが、Hiero Font EditorというのとBMFontGeneratorというが推奨されているようです。
BMFontはWindowsでしか動かないので、とりあえずhieroを使ってみたんですが、どうもうちではうまく動作してくれませんでした。
(出力画像が天地左右反転されたり、出力対象がコピペできなかったり、一度出力すると変更して二度目の出力が出来なかったり)
なのでBMFontを使ったやり方を紹介します。
・必要な文字を含んだテキストファイルを作成(UTF-16で保存)
・Edit -> Select chars from file で上記ファイルを選択
・Export OptionsでBit depth を 32、png 出力
・Font Settingsで Font smoothing を選択
色などはお好みで、cocos2d側でも変更が効くので特に気にする必要もないと思います。
これで出力された .fnt ファイルを CCBitmapFontAtlas で読み込んでやればBitmapFontで描画されます。
2010年6月24日木曜日
iOS3のプロジェクトをiOS4に対応してみる
iOS4が正式に公開されたので、プロジェクトをアップデートしてみるテスト
iPhoneDevよりxcode 3.2.3 finalをインストール
古いxcodeやiPhone simulatorが立ち上がってたら落としておくこと。インストールに失敗する事があるので落としておく。
iTunesも途中で落とせと言われるので先に落としておくのが吉。
とりあえずそのまま以前のプロジェクトを実行してみる>エラー>あるある
UIView.h等で以下のようなエラーが多発
syntax error before '^' token
なぞい、コンパイラをGCC4.2からLLVM GCC4.2に変更すると回避出来るけど・・・
再度ビルド>エラー>ですよねー
今度はSBJSONでエラーが出てる
とりあえず最新版を落としてドキュメントを読んでみると、インストール方法が変わったらしい
追加SDKとリンカグラグをはずして、最新のオススメインストール方法(クラスコピーするだけ)に戻したらさっくり動いた
コンパイラの設定をGCC4.2に戻しても問題なし、と。なんだよ、ちょっと焦っちゃったヨ。
なんでJSON-Frameworkとか使ってないプロジェクトはそのままでいけると思う。
cocos2d(v0.99.3)に関しては今の所問題無し。
お次は実機に・・・と思ったらプロビジョニングされた実機がつながってないよ、と
どうやら実機をiOS4にアップデートしたら別物として認識されているっぽい
xcodeのオーガナイザからIdentifierをコピーして・・・と思ったら「デバイスを開発で使う」みたいなボタンが出ていたので押してみる。
iTunesConnectのIDをきかれ、xcodeからデバイスの登録が完了!
xcode上でiTunesConnectと連携出来るのね、これはイイ改良
HPから確認してみるとTeam Provisioning Profile: *というのが追加されていた
とりあえずこの状態で実機の動作確認もOK
シミュレータで注意しないといけないのが、HOMEボタンで終了ではなくなったので、HOMEおしてもタスクは実行中ということ(3G実機では終了されるけどね :p)
ここで新しいイベント(applicationDidEnterBackground)が飛ぶので、必要ならば処理を追加する。
コチラに日本語で詳しい内容がアップされています。
どうやらapplicationWillTerminateが呼ばれずに終わる事もあるそうで・・・?(本体ないし未確認)
終了処理はちょっと気を付けた方が良さそうです。
当面はiPhoneシミュレータを見ながらiPhone4が手元に届くのを待っています・・・
iPhoneDevよりxcode 3.2.3 finalをインストール
古いxcodeやiPhone simulatorが立ち上がってたら落としておくこと。インストールに失敗する事があるので落としておく。
iTunesも途中で落とせと言われるので先に落としておくのが吉。
とりあえずそのまま以前のプロジェクトを実行してみる>エラー>あるある
UIView.h等で以下のようなエラーが多発
syntax error before '^' token
なぞい、コンパイラをGCC4.2からLLVM GCC4.2に変更すると回避出来るけど・・・
再度ビルド>エラー>ですよねー
今度はSBJSONでエラーが出てる
とりあえず最新版を落としてドキュメントを読んでみると、インストール方法が変わったらしい
追加SDKとリンカグラグをはずして、最新のオススメインストール方法(クラスコピーするだけ)に戻したらさっくり動いた
コンパイラの設定をGCC4.2に戻しても問題なし、と。なんだよ、ちょっと焦っちゃったヨ。
なんでJSON-Frameworkとか使ってないプロジェクトはそのままでいけると思う。
cocos2d(v0.99.3)に関しては今の所問題無し。
お次は実機に・・・と思ったらプロビジョニングされた実機がつながってないよ、と
どうやら実機をiOS4にアップデートしたら別物として認識されているっぽい
xcodeのオーガナイザからIdentifierをコピーして・・・と思ったら「デバイスを開発で使う」みたいなボタンが出ていたので押してみる。
iTunesConnectのIDをきかれ、xcodeからデバイスの登録が完了!
xcode上でiTunesConnectと連携出来るのね、これはイイ改良
HPから確認してみるとTeam Provisioning Profile: *というのが追加されていた
とりあえずこの状態で実機の動作確認もOK
シミュレータで注意しないといけないのが、HOMEボタンで終了ではなくなったので、HOMEおしてもタスクは実行中ということ(3G実機では終了されるけどね :p)
ここで新しいイベント(applicationDidEnterBackground)が飛ぶので、必要ならば処理を追加する。
コチラに日本語で詳しい内容がアップされています。
どうやらapplicationWillTerminateが呼ばれずに終わる事もあるそうで・・・?(本体ないし未確認)
終了処理はちょっと気を付けた方が良さそうです。
当面はiPhoneシミュレータを見ながらiPhone4が手元に届くのを待っています・・・
2010年4月23日金曜日
iPhoneでバイブレーションを作動させる
#import <AudioToolbox/AudioToolbox.h>
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
AudioToolBoxをインポートして AudioServicesPlaySystemSound を呼ぶだけ・・・
Twitterでつぶやける程のコード量で拍子抜けしたw
2010年4月6日火曜日
iPhoneおアプリ内課金について・その1
iPhoneでアプリ内課金をするのに色々と面倒だったのでまとめておく
概念とかはStoreKitガイド辺りで把握出来ますので、実際にコードに組み込む辺りを。
・まずはプロジェクトにStoreKitFrameworkを追加する。
プロジェクトの編集>一般>リンク済みライブラリの「+」から StoreKit.framework を選択して追加
なぜかリストには反映されないが、動作しているので気にしない
これってiPhoneアプリ的には常識なんでしょうかね・・・まったく知らなかったんでここに来るのすら苦労しましたw
・下準備
#import <StoreKit/StoreKit.h>
して、クラスに <SKProductsRequestDelegate> を追加する
こんな感じ
・購入するアイテムの情報を取得
SKProductsRequest *request=[[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:@"PRODUCT_ID"]];
PRODUCT_IDはitunes connectで指定したものをあてる。
通信中の処理待ちなどはアプリ側で各自実装、リクエストが終わると productsRequest がコールされる
request は requestDidFinish で解放してやりましょう
itunes connectへ課金アイテムの登録がうまくいっていれば、この時点でアイテムの名称がログに出力されます。
後は SKPaymentQueue の使い方と、テストユーザでの購入の仕方、その際のTIPS等
概念とかはStoreKitガイド辺りで把握出来ますので、実際にコードに組み込む辺りを。
・まずはプロジェクトにStoreKitFrameworkを追加する。
プロジェクトの編集>一般>リンク済みライブラリの「+」から StoreKit.framework を選択して追加
なぜかリストには反映されないが、動作しているので気にしない
これってiPhoneアプリ的には常識なんでしょうかね・・・まったく知らなかったんでここに来るのすら苦労しましたw
・下準備
#import <StoreKit/StoreKit.h>
して、クラスに <SKProductsRequestDelegate> を追加する
こんな感じ
#import <StoreKit/StoreKit.h>
@interface TestLayer : NSObject <SKProductsRequestDelegate> {
}
@end
・購入するアイテムの情報を取得
SKProductsRequest *request=[[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:@"PRODUCT_ID"]];
PRODUCT_IDはitunes connectで指定したものをあてる。
通信中の処理待ちなどはアプリ側で各自実装、リクエストが終わると productsRequest がコールされる
-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
// プロダクトの取得
SKProduct *product = [[response products] lastObject];
// アイテムのタイトル
NSLog(@"%@",product.localizedTitle);
}
request は requestDidFinish で解放してやりましょう
- (void)requestDidFinish:(SKRequest *)request {
[request release];
}
itunes connectへ課金アイテムの登録がうまくいっていれば、この時点でアイテムの名称がログに出力されます。
後は SKPaymentQueue の使い方と、テストユーザでの購入の仕方、その際のTIPS等
2010年3月21日日曜日
2010年3月11日木曜日
AppStoreへ申請するアプリにjson-frameworkを使用している場合の注意点
AppStoreへアプリを登録する際に、嫌というほど目にする以下のエラー
The binary you uploaded was invalid. The signature was invalid, or it was not signed with an Apple submission certificate
基本的にはCodeSign系のエラーですが、その他のエラーもすべてこれで帰ってくるもよう。
Webで調べたら以下のような症状があった。
・Developerの証明書でビルドしていた
・Distribution or Provisioningの証明書の有効期限が切れていた(それぞれ別の有効期限になるので注意)
・Info.plistのBundle identifierが登録した内容と違っていた
・プロジェクト>アクティブターゲット"あぷり名"を編集>プロパティ>識別子 がInfo.plistのBundle identifierと一致しなかった(基本的には同期するはずなんだけども・・・)
・アイコンファイルのサイズが57x57ではなかった、また24bitでなかった(これに結構ひっかかってた・・・24bitのPNGでもMacのプレビュー>インスペクタではビット深度8と表示される)
・コード署名IDの設定を、プロジェクト>プロジェクト設定を編集 から行った(必ず、アクティブターゲット"あぷり名"を編集 から行った方が良いです)
Xcodeのビルドは基本的に差分ビルドなので、Distributionの場合は毎回クリーンした方が良いです。
そして、Xcode自体にもなんやらキャッシュっぽい感じで設定が残るようです。
公式にもありますが、いったんCodeSignをはずして、クリーンしてフォルダも消して、Xcodeを再起動してCodeSignを当てなおすとうまく行くとかあるようです。
で、色々やった結果全部だめだったので途方にくれていたのですが、ふと使用しているライブラリのCodeSignとかどうなるんだろと思って調べたら、これがビンゴでした。
cocos2dとjson-frameworkを使ったのですが、cocos2dは特に設定無しで問題ないもよう。
json-frameworkでは、2.2の頃にCodeSign系のなんやらがあったようで、以下の設定をすると良いとの事でした。
「アクティブターゲット"あぷり名"を編集」から「コード署名リソース・ルールパス」に、$(SDKROOT)/ResourceRules.plist を入力
説明には「ビルド実行可能ファイルのコード署名後に変更する有効な理由のあるファイルを除外するために、オプションで使用されます」とありますので、なんかの理由があるんでしょ、きっと。
2.2の頃の話+AdHocや実機デバッグでは問題なく動いていたので、マサカネーと思いつつアップしたらあっさりと通りました(><)
そんなわけで、転職しましてWebプログラマじゃなくなっていたりします。(Webアプリも書いていますが・・・)
無料アプリなので審査が通ったら公開致します :)
The binary you uploaded was invalid. The signature was invalid, or it was not signed with an Apple submission certificate
基本的にはCodeSign系のエラーですが、その他のエラーもすべてこれで帰ってくるもよう。
Webで調べたら以下のような症状があった。
・Developerの証明書でビルドしていた
・Distribution or Provisioningの証明書の有効期限が切れていた(それぞれ別の有効期限になるので注意)
・Info.plistのBundle identifierが登録した内容と違っていた
・プロジェクト>アクティブターゲット"あぷり名"を編集>プロパティ>識別子 がInfo.plistのBundle identifierと一致しなかった(基本的には同期するはずなんだけども・・・)
・アイコンファイルのサイズが57x57ではなかった、また24bitでなかった(これに結構ひっかかってた・・・24bitのPNGでもMacのプレビュー>インスペクタではビット深度8と表示される)
・コード署名IDの設定を、プロジェクト>プロジェクト設定を編集 から行った(必ず、アクティブターゲット"あぷり名"を編集 から行った方が良いです)
Xcodeのビルドは基本的に差分ビルドなので、Distributionの場合は毎回クリーンした方が良いです。
そして、Xcode自体にもなんやらキャッシュっぽい感じで設定が残るようです。
公式にもありますが、いったんCodeSignをはずして、クリーンしてフォルダも消して、Xcodeを再起動してCodeSignを当てなおすとうまく行くとかあるようです。
で、色々やった結果全部だめだったので途方にくれていたのですが、ふと使用しているライブラリのCodeSignとかどうなるんだろと思って調べたら、これがビンゴでした。
cocos2dとjson-frameworkを使ったのですが、cocos2dは特に設定無しで問題ないもよう。
json-frameworkでは、2.2の頃にCodeSign系のなんやらがあったようで、以下の設定をすると良いとの事でした。
「アクティブターゲット"あぷり名"を編集」から「コード署名リソース・ルールパス」に、$(SDKROOT)/ResourceRules.plist を入力
説明には「ビルド実行可能ファイルのコード署名後に変更する有効な理由のあるファイルを除外するために、オプションで使用されます」とありますので、なんかの理由があるんでしょ、きっと。
2.2の頃の話+AdHocや実機デバッグでは問題なく動いていたので、マサカネーと思いつつアップしたらあっさりと通りました(><)
そんなわけで、転職しましてWebプログラマじゃなくなっていたりします。(Webアプリも書いていますが・・・)
無料アプリなので審査が通ったら公開致します :)
2010年2月4日木曜日
C#でiPhoneアプリを作ってみた!
C#や.Net Frameworkを使ってiPhoneアプリを開発出来るというMonoTouchを使ってみた
まずMonoFrameworkとMonoDevelopをダウンロード&インストールする。(共にMac版)
次にMonoTouchのSDKをダウンロードする
上記2つは無料らしい、MonoTouchは有料だけどTrial出来るので今回はそれで試してみました
あ、もちろんiPhoneSDKは必須です。AppleIDを取得すれば無料でダウンロード可能
全部インストールした所でおもむろにMonoDevelopを起動、、、はい、文字化けしてます
ぐぐると早速答えがあったので設定します

はい、バッチリ日本語でました
とりあえず公式のチュートリアルを進めてみます
ファイル>新規>ソリューション で テンプレートから C#>iPhone を選択

早速使えるテンプレートが増えているようです、今回はHelloWorldなんで、iPhone Window-based Projectでいってみましょう
とりあえず作成しただけの状態で実行してみます・・・

iPhone Simulatorが立ち上がってまっしろな画面が出ました、ここまでは良好ですね。
生成されたプロジェクトの MainWindow.xib をダブルクリックすると InterfaceBuilder が起動しました。
この辺はXcodeで作る時と同じ容量で良さそうですね。
InterfaceBuilderで生成されたOutletやActionを、MainWindow.xib.designer.cs という自動生成されたファイルで関連付けしてくれます。
で作ってみたHelloWorldがこんな感じ

残念なところは、MonoDevelopが日本語入力出来ません・・・
ファイルを直接別のエディタで編集すれば日本語も使えますが、ちょっと効率悪いですね。
実機テストもしてみようかと思ったのですが、実機テストが出来るのは有料版のみのようです。
C#マカーがどれだけいるのかわかりませんが、actionscript等、別の言語で作れるようになるのは非常に良い事です。
今後に是非期待しましょう!
まずMonoFrameworkとMonoDevelopをダウンロード&インストールする。(共にMac版)
次にMonoTouchのSDKをダウンロードする
上記2つは無料らしい、MonoTouchは有料だけどTrial出来るので今回はそれで試してみました
あ、もちろんiPhoneSDKは必須です。AppleIDを取得すれば無料でダウンロード可能
全部インストールした所でおもむろにMonoDevelopを起動、、、はい、文字化けしてます
ぐぐると早速答えがあったので設定します

はい、バッチリ日本語でました
とりあえず公式のチュートリアルを進めてみます
ファイル>新規>ソリューション で テンプレートから C#>iPhone を選択

早速使えるテンプレートが増えているようです、今回はHelloWorldなんで、iPhone Window-based Projectでいってみましょう
とりあえず作成しただけの状態で実行してみます・・・

iPhone Simulatorが立ち上がってまっしろな画面が出ました、ここまでは良好ですね。
生成されたプロジェクトの MainWindow.xib をダブルクリックすると InterfaceBuilder が起動しました。
この辺はXcodeで作る時と同じ容量で良さそうですね。
InterfaceBuilderで生成されたOutletやActionを、MainWindow.xib.designer.cs という自動生成されたファイルで関連付けしてくれます。
で作ってみたHelloWorldがこんな感じ

残念なところは、MonoDevelopが日本語入力出来ません・・・
ファイルを直接別のエディタで編集すれば日本語も使えますが、ちょっと効率悪いですね。
実機テストもしてみようかと思ったのですが、実機テストが出来るのは有料版のみのようです。
C#マカーがどれだけいるのかわかりませんが、actionscript等、別の言語で作れるようになるのは非常に良い事です。
今後に是非期待しましょう!
2009年2月3日火曜日
grails run-app が永久ループする件について
前にrun-appした時に、起動後永遠とリロードを繰り返して動かないという状況がありました。
その時はinteractiveでrun-appした時はちゃんと動くので、そのままにしてたのですが、最近ふとしたきっかけで解決しました。
groovyファイルとかjavaファイルとかを実行時にコンパイルするのですが、
packageが指定してある場合に、packageと実際にフォルダ位置があっていない場合に上記の症状が発生します。
多分生成するclassと実際のソースパスが一致しないため、いつまでも新規ファイルが投入されたと思ってコンパイルを繰り返すものと思われます。
なんでpackage名とフォルダ構成をあわせてやるだけでOKです。
まったく関係ない話ですがアップルとアドビが組んでiPhone用Flashを開発中という話
ってーことはflexアプリとか動いちゃうんかいなー?アプリ形式に対応すればAppStoreへの登録も可能なわけで :)
もの凄く夢が広がりんぐ!
Androidの方はどうなんだろ、Flashには対応してるみたいだけどアプリ的に扱えるようになればおもしろいですね。
Android/iPhoneのマルチプラットフォームアプリケーション開発とか出来たらかっこいいな〜
adobe labsが出来た辺りからadobeには色々とワクワクさせられます。
その時はinteractiveでrun-appした時はちゃんと動くので、そのままにしてたのですが、最近ふとしたきっかけで解決しました。
groovyファイルとかjavaファイルとかを実行時にコンパイルするのですが、
packageが指定してある場合に、packageと実際にフォルダ位置があっていない場合に上記の症状が発生します。
多分生成するclassと実際のソースパスが一致しないため、いつまでも新規ファイルが投入されたと思ってコンパイルを繰り返すものと思われます。
なんでpackage名とフォルダ構成をあわせてやるだけでOKです。
まったく関係ない話ですがアップルとアドビが組んでiPhone用Flashを開発中という話
ってーことはflexアプリとか動いちゃうんかいなー?アプリ形式に対応すればAppStoreへの登録も可能なわけで :)
もの凄く夢が広がりんぐ!
Androidの方はどうなんだろ、Flashには対応してるみたいだけどアプリ的に扱えるようになればおもしろいですね。
Android/iPhoneのマルチプラットフォームアプリケーション開発とか出来たらかっこいいな〜
adobe labsが出来た辺りからadobeには色々とワクワクさせられます。
2009年1月14日水曜日
iPhoneでJsonをごにょごにょ
簡単なJSONを返すアクションを作成
ブラウザで確認すると、こんな感じのJSONデータが返ります。
これをiPhoneでうけとってTableViewに表示します。
JSONを取得する部分
基本は前と一緒です。シングルクォートをダブルクォートに置換したりしてます。
webResultはクラスのフィールドです。
取得した値をループし、webResultへ追加していきます。
InterfaceBuilderでTableViewをおいて、Outletとdelegateを設定します。

dataSource、delegateをFile'sOwnerに設定し、クラスに定義したtableViewと連結します。
クラスにtableView用の定義をします。
上から順番に
numberOfRowsInSection : テーブルに何件あるかを返すメソッド
cellForRowAtIndexPath : 1行毎に表示するメソッド
didSelectRowAtIndexPath : 行を選択した時のアクション
です。
詳細はメモなんで略 :p
def json = {
def jsonData=[["name":"任天堂","hard":"wii"],
["name":"sony","hard":"PlayStation3"],
["name":"Microsoft","hard":"XBOX360"]]
render(text:jsonData as JSON)
}
ブラウザで確認すると、こんな感じのJSONデータが返ります。
[{"name":"任天堂","hard":"wii"},{"name":"sony","hard":"PlayStation3"},{"name":"Microsoft","hard":"XBOX360"}]
これをiPhoneでうけとってTableViewに表示します。
JSONを取得する部分
- (void)getJSON {
NSURL *jsonURL = [NSURL URLWithString:@"http://localhost:8080/jsonSample/test/json"];
NSMutableString *jsonData = [NSMutableString stringWithContentsOfURL:jsonURL encoding:NSUTF8StringEncoding error:nil];
[jsonData replaceOccurrencesOfString:@"'"
withString:@"\""
options:NSCaseInsensitiveSearch
range:NSMakeRange(0,[jsonData length])];
NSLog(jsonData);
if (jsonData == nil) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Webservice Error" message:@"JSON Dataの取得に失敗しました。" delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
[alert show];
[alert release];
} else {
SBJSON *json = [SBJSON new];
json.humanReadable = YES;
id result = [jsonData JSONValue];
NSLog([json stringWithObject:result error:NULL]);
webResult = [[NSMutableArray alloc] init];
NSEnumerator* enumerator;
enumerator = [result objectEnumerator];
// while文を使って要素にアクセスする
id obj;
while (obj = [enumerator nextObject]) {
[webResult addObject:obj];
}
printf("データ件数 %d",[webResult count]);
}
}
基本は前と一緒です。シングルクォートをダブルクォートに置換したりしてます。
webResultはクラスのフィールドです。
取得した値をループし、webResultへ追加していきます。
InterfaceBuilderでTableViewをおいて、Outletとdelegateを設定します。

dataSource、delegateをFile'sOwnerに設定し、クラスに定義したtableViewと連結します。
クラスにtableView用の定義をします。
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [webResult count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell;
cell = [[UITableViewCell alloc] init];
cell.text = [[webResult objectAtIndex:indexPath.row] objectForKey:@"name"];
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"あなたが選んだのは"
message:[[webResult objectAtIndex:indexPath.row] objectForKey:@"hard"]
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles: nil];
[alert show];
[alert release];
}
上から順番に
numberOfRowsInSection : テーブルに何件あるかを返すメソッド
cellForRowAtIndexPath : 1行毎に表示するメソッド
didSelectRowAtIndexPath : 行を選択した時のアクション
です。
詳細はメモなんで略 :p
2009年1月12日月曜日
よろしい、ならばiPhoneでJSONだ その3
Grailsのアプリと通信してJSONデータを取得するサンプルです。
Grails側にJSONデータを返すアクションを用意します。
contentTypeは application/json でも無指定でも読み込める。
Objective-C側
NSString の initWithContentsOfURL で encoding を指定するのがポイントです。
encodingがあってないと nil になって通信出来てないのかと思って悩んでました・・・
そろそろインターフェース側の処理をやっていこうかな :)
Grails側にJSONデータを返すアクションを用意します。
def json = {
def jsonData=["任天堂":"wii","sony":"PlayStation3","Microsoft":"XBOX360"]
render(text:jsonData as JSON,contentType:"application/x-json")
}
contentTypeは application/json でも無指定でも読み込める。
Objective-C側
NSURL *jsonURL = [NSURL URLWithString:@"http://localhost:8080/jsonSample/test/json"];
NSString *jsonData = [[NSString alloc] initWithContentsOfURL:jsonURL encoding:NSUTF8StringEncoding error:nil];
if (jsonData == nil) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Webservice Error" message:@"JSON Dataの取得に失敗しました。" delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
[alert show];
[alert release];
} else {
SBJSON *json = [SBJSON new];
json.humanReadable = YES;
id jsonItem = [jsonData JSONValue];
NSLog([json stringWithObject:jsonItem error:NULL]);
}
NSString の initWithContentsOfURL で encoding を指定するのがポイントです。
encodingがあってないと nil になって通信出来てないのかと思って悩んでました・・・
そろそろインターフェース側の処理をやっていこうかな :)
よろしい、ならばiPhoneでJSONだ その2
Objective-CでJsonを取り扱うスニペットめもりんぐ
NSDictionaryとNSStringをいったりきたり
jsonでパース出来るのは、ダブルクォートだけです、シングルコートはだめです。(これにずっと気づかなかった・・・)
objectWithStringの返り値はNSArrayだったりNSDictionaryだったりするので、idで受け取る必要があります。
NSDictionaryとNSStringをいったりきたり
// NSDictionaryからStringに
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
@"The iPhone", @"Today",
@"The World", @"Tomorrow",
nil];
SBJSON *json = [SBJSON new];
json.humanReadable = YES;
NSLog([json stringWithObject:dict error:NULL]);
// StringからNSDictionaryに
NSString *jsonString = @"{\"hoge\":\"foo\",\"wow\":[\"good\",\"cool\"]}";
id jsonObj = [json objectWithString:jsonString error:NULL];
if(jsonObj==NULL || jsonObj==nil) {
printf("NULL dayo\n");
} else {
NSLog([json stringWithObject:jsonObj error:NULL]);
}
jsonでパース出来るのは、ダブルクォートだけです、シングルコートはだめです。(これにずっと気づかなかった・・・)
objectWithStringの返り値はNSArrayだったりNSDictionaryだったりするので、idで受け取る必要があります。
2009年1月6日火曜日
よろしい、ならばiPhoneでJSONだ
GoogleCodeにてObjective-CのJSON Frameworkが公開されています。
http://code.google.com/p/json-framework/
これを使ってiPhoneでJSONを使用してみましょう。
以下の記事を参考にしています。
http://iphone.zcentric.com/2008/08/28/using-threads-for-a-json-request/
まずはJSON Frameworkのインストールです。
GoogleCodeからdmgをダウンロードします。
ユーザのLibraryフォルダへSDKsフォルダをコピーします。
(ユーザが hoge だった場合 > /Users/hoge/Library に dmg内の SDKs をコピー)
xcodeを立ち上げて適当な iPhone プロジェクトを生成します。
メニューから、「プロジェクト」>「プロジェクト設定を編集」 で 追加SDK へ以下の設定を追記します。
$HOME/Library/SDKs/JSON/$(PLATFORM_NAME).sdk

「他のリンカフラグ」 へ以下の設定を追記します。
-ObjC -ljson
あとはJSONを使用するコードで JSON/JSON.h をインポートしてやればOKです。
上記サイトにサンプルアプリもアップされています。
以下サンプルアプリを実行した画面です。
http://code.google.com/p/json-framework/
これを使ってiPhoneでJSONを使用してみましょう。
以下の記事を参考にしています。
http://iphone.zcentric.com/2008/08/28/using-threads-for-a-json-request/
まずはJSON Frameworkのインストールです。
GoogleCodeからdmgをダウンロードします。
ユーザのLibraryフォルダへSDKsフォルダをコピーします。
(ユーザが hoge だった場合 > /Users/hoge/Library に dmg内の SDKs をコピー)
xcodeを立ち上げて適当な iPhone プロジェクトを生成します。
メニューから、「プロジェクト」>「プロジェクト設定を編集」 で 追加SDK へ以下の設定を追記します。
$HOME/Library/SDKs/JSON/$(PLATFORM_NAME).sdk

「他のリンカフラグ」 へ以下の設定を追記します。
-ObjC -ljson
あとはJSONを使用するコードで JSON/JSON.h をインポートしてやればOKです。
上記サイトにサンプルアプリもアップされています。
以下サンプルアプリを実行した画面です。
2008年12月31日水曜日
iPhoneで動かすHelloWorld その4
インフルエンザで死んでおります・・・胃が痛い(T_T)
高熱でちょっと忘れかけておりますが、日々の積み重ねが大事です!
ではViewControllerの実装です。
MyViewController.m で警告が出ているはずです。
MyViewController.h で property 指定した textField , label , string に対するメソッドがないという事なので、アクセサメソッドの実装をしてやります。
これらのインスタンス変数が正しく解放されるように dealloc に追記します。
ボタンを押させると changeGreeting がコールされる所まで確認しましたので、ここでテキストフィールドから文字列を取得し、ラベルを書き換えるようにします。
ここまででビルドすると、以下のような結果が得られます。

大筋は完了しましたが、キーボードが閉じられない事に気がつくでしょう。
MyViewController.m に以下のコードを追記します。
再度実行すると、Doneでキーボードが隠れる事を確認できます。
以上で完成です!思ったより長かったです・・・体が痛い(T_T)
高熱でちょっと忘れかけておりますが、日々の積み重ねが大事です!
ではViewControllerの実装です。
MyViewController.m で警告が出ているはずです。
MyViewController.h で property 指定した textField , label , string に対するメソッドがないという事なので、アクセサメソッドの実装をしてやります。
@synthesize textField;
@synthesize label;
@synthesize string;
これらのインスタンス変数が正しく解放されるように dealloc に追記します。
- (void)dealloc {
[textField release];
[label release];
[string release];
[super dealloc];
}
ボタンを押させると changeGreeting がコールされる所まで確認しましたので、ここでテキストフィールドから文字列を取得し、ラベルを書き換えるようにします。
- (IBAction)changeGreeting:(id)sender {
self.string=textField.text; // textFieldから文字列を取得し、自身のstring変数に格納します。
NSString *nameString=string;
if([nameString length]==0) {
nameString=@"World"; // textFieldの文字列が空なら World を代入する
}
NSString *greeting=[[NSString alloc] initWithFormat:@"Hello, %@!",nameString]; // ラベルに表示するメッセージを作成
label.text=greeting;
[greeting release];
}
ここまででビルドすると、以下のような結果が得られます。

大筋は完了しましたが、キーボードが閉じられない事に気がつくでしょう。
MyViewController.m に以下のコードを追記します。
- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
if(theTextField==textField) {
[textField resignFirstResponder];
}
return YES;
}
再度実行すると、Doneでキーボードが隠れる事を確認できます。
以上で完成です!思ったより長かったです・・・体が痛い(T_T)
2008年12月27日土曜日
iPhoneで動かすHelloWorld その3
Viewに物をおいてみましょう!
ControllerView.xib をインターフェースビルダーで起動して、LibraryからTextField と Label と Round Rect Button を配置します。
↓こんな感じです。

各Objectの設定はInspectorパネルから色々操作出来ます。
TextのInspectorを見ると、TextInputTraitsという項目があって、ここでキーボードの形や、決定ボタンの形などが調整出来ます。
ここでシミュレーターで実行してみると、キーボードは開きますが、消す事が出来ない状態です。
これはキーボードの終了イベントを受け取る場所がないのでキーボードが閉じられないというわけです。
このイベントをMyViewControllerと関連付けします。
関連付けはアウトレットというインスタンス変数によって行われます。
MyViewController.h
実装クラスへメソッドの中身を定義します。
MyViewController.m
保存してインターフェースビルダーへ戻り、File's OwnerのIdentity Inspectorをみると、
Class ActionとClass OutletsにchangeGreetingとlabel,textFieldが追加されています。
これはMyViewControllerクラスがControllerViewのビュークラスとして指定されている為です。
インターフェース上に設置されたオブジェクトとフィールドを関連付けます。
File's Ownerを右クリックして出てきたリストから○をドラッグして、関連付けたいオブジェクトへドロップします。
ボタンのアクションをファンクションへ関連付けます。
ボタンをCTRL+クリックで出てくるInspectorの中からTouch Up Insideの○をFile's Ownerへドラッグ&ドロップします。
changeGreetingが表示されるのでそれを選択する事で関連付けが行われます。
テキストフィールドのデリゲートを設定します。
テキストフォールドをCTRL+ドラッグでFile's Ownerへドロップします。
選択肢からDelegateを選ぶ事でデリゲートの設定が行われます。
ここまで設定したら一度実行してみます。
ボタンを押してコンソールにcall!が表示されたら連携がうまくいっています!
次は実際に処理を書いていきます。(まだまだキーボードは戻せません :p)
ControllerView.xib をインターフェースビルダーで起動して、LibraryからTextField と Label と Round Rect Button を配置します。
↓こんな感じです。

各Objectの設定はInspectorパネルから色々操作出来ます。
TextのInspectorを見ると、TextInputTraitsという項目があって、ここでキーボードの形や、決定ボタンの形などが調整出来ます。
ここでシミュレーターで実行してみると、キーボードは開きますが、消す事が出来ない状態です。
これはキーボードの終了イベントを受け取る場所がないのでキーボードが閉じられないというわけです。
このイベントをMyViewControllerと関連付けします。
関連付けはアウトレットというインスタンス変数によって行われます。
MyViewController.h
#import
//MyViewControllerはテキストフィールドのデリゲートになるため、UITextFieldDelegateプロトコルを採用する必要があります。
//プロトコルの指定はクラスの継承元クラスの後に <> で指定します。
@interface MyViewController : UIViewController{
//IBOutletは、続く宣言をアウトレットとして使う。という指示です。
IBOutlet UITextField *textField;
IBOutlet UILabel *label;
NSString *string;
}
//@propertyでgetter,setterをproperty定義します。
@property (nonatomic, retain) UITextField *textField;
@property (nonatomic, retain) UILabel *label;
@property (nonatomic, copy) NSString *string;
//Helloボタンを処理するchangeGreetingメソッドを定義します。
//IBActionは、続く宣言をターゲット/アクション接続のアクションとして扱う。という指示です。
-(IBAction)changeGreeting:(id)sender;
@end
実装クラスへメソッドの中身を定義します。
MyViewController.m
- (IBAction)changeGreeting:(id)sender {
printf("call!");
}
保存してインターフェースビルダーへ戻り、File's OwnerのIdentity Inspectorをみると、
Class ActionとClass OutletsにchangeGreetingとlabel,textFieldが追加されています。
これはMyViewControllerクラスがControllerViewのビュークラスとして指定されている為です。
インターフェース上に設置されたオブジェクトとフィールドを関連付けます。
File's Ownerを右クリックして出てきたリストから○をドラッグして、関連付けたいオブジェクトへドロップします。
ボタンのアクションをファンクションへ関連付けます。
ボタンをCTRL+クリックで出てくるInspectorの中からTouch Up Insideの○をFile's Ownerへドラッグ&ドロップします。
changeGreetingが表示されるのでそれを選択する事で関連付けが行われます。
テキストフィールドのデリゲートを設定します。
テキストフォールドをCTRL+ドラッグでFile's Ownerへドロップします。
選択肢からDelegateを選ぶ事でデリゲートの設定が行われます。
ここまで設定したら一度実行してみます。
ボタンを押してコンソールにcall!が表示されたら連携がうまくいっています!
次は実際に処理を書いていきます。(まだまだキーボードは戻せません :p)
2008年12月25日木曜日
iPhoneで動かすHelloWorld その2
Viewを追加するにはViewControllerとnibファイルを使用します。
まずはViewControllerの作成です。
Xcodeから新規ファイルで CocoaTouchClasses の UIViewControler subclass を選択します。
テンプレートを元にざっくりとファイルが生成されます。
作成したクラスをアプリケーションデリゲートのインスタンス変数に追加します。
作成したクラスをMyViewControllerとし、HelloWorldAppDelegateへ以下のように定義します。
HelloWorldAppDelegate.h
HelloWorldAppDelegate.m
ビューを作成します。
InterfaceBuilderを起動して新規作成>CocoaTouch>Viewでビューが作成できます。
ControllerView.nib としてHelloWorld プロジェクトに保存します。
Xcodeが立ち上がっていれば、自動的にリソースとして取り込むか選択が出ます。
リソースとして登録されたらResourcesフォルダに移動します。
このViewがどのコントローラークラスに所属するかを指定します。
Tools > Identity Inspector を起動して、File's Ownerを選択>ClassにMyViewControllerを指定します。
File's Ownerにアウトレット(nibファイル内の項目に接続しているインスタンス変数)を設定します。
File's OwnerをCtrlクリックしながらViewまでドラッグすればOKです。
Tool > Attribute Inspector から BackgroundColorを変更してシミュレーターで動かすと、このViewが正しく読み込まれているのがわかります。
次はビューにオブジェクトを追加します。
まずはViewControllerの作成です。
Xcodeから新規ファイルで CocoaTouchClasses の UIViewControler subclass を選択します。
テンプレートを元にざっくりとファイルが生成されます。
作成したクラスをアプリケーションデリゲートのインスタンス変数に追加します。
作成したクラスをMyViewControllerとし、HelloWorldAppDelegateへ以下のように定義します。
HelloWorldAppDelegate.h
#import
@class MyViewController; // クラス宣言
@interface HelloWorldAppDelegate : NSObject{
UIWindow *window;
MyViewController *myViewController; // 追加したビューをインスタンス変数として定義します
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) MyViewController *myViewController;
@end
HelloWorldAppDelegate.m
#import "HelloWorldAppDelegate.h"
#import "MyViewController.h" // インポート宣言
@implementation HelloWorldAppDelegate
@synthesize window;
// アクセサメソッドの合成?
@synthesize myViewController;
- (void)applicationDidFinishLaunching:(UIApplication *)application {
// ViewControllerの作成、ControllerView.nibをターゲットとします。bundleはresouceの位置的な情報?
MyViewController *aViewController = [[MyViewController alloc]initWithNibName:@"ControllerView" bundle:[NSBundle mainBundle]];
// デリゲータのmyViewControllerに上で作成したインスタンスを指定
self.myViewController=aViewController;
// 一時インスタンスの解放
[aViewController release];
// myViewControllerからviewを取得
UIView *controllersView=[myViewController view];
// windowへControllerViewのviewを追加
[window addSubview:controllersView];
[window makeKeyAndVisible];
}
- (void)dealloc {
[myViewController release]; // デリゲートが解放される時(アプリ終了時)にビューを一緒に解放します
[window release];
[super dealloc];
}
@end
ビューを作成します。
InterfaceBuilderを起動して新規作成>CocoaTouch>Viewでビューが作成できます。
ControllerView.nib としてHelloWorld プロジェクトに保存します。
Xcodeが立ち上がっていれば、自動的にリソースとして取り込むか選択が出ます。
リソースとして登録されたらResourcesフォルダに移動します。
このViewがどのコントローラークラスに所属するかを指定します。
Tools > Identity Inspector を起動して、File's Ownerを選択>ClassにMyViewControllerを指定します。
File's Ownerにアウトレット(nibファイル内の項目に接続しているインスタンス変数)を設定します。
File's OwnerをCtrlクリックしながらViewまでドラッグすればOKです。
Tool > Attribute Inspector から BackgroundColorを変更してシミュレーターで動かすと、このViewが正しく読み込まれているのがわかります。
次はビューにオブジェクトを追加します。
2008年12月23日火曜日
iPhoneで動かすHelloWorld その1
とりあえずHelloWorld的なものを作ってみよう!
とはいってもDeveloperCenterのiPhoneアプリケーションチュートリアルを実行しながらメモるだけですが :)
まずは最低限必要なCocoaのデザインパターンの説明をざっくりと
・Delegation
オブジェクトが、デリゲートとして指定された別のオブジェジェクトに定期的にメッセージを送信し、入力の要求やイベントの発生を通知するデザインパターン。
このデザインパターンはクラス継承の代替手段として、再利用可能なオブジェクトの機能を拡張するために使用する。
使用される場所:メイン処理の終了感知、ビューのセットアップ&管理、テキストフィールドのReturnイベント処理等
・Model-View-Controller
いわゆるMVC。
Model=データ、オブジェクト
View=ユーザインターフェース部分
Controller=ModelとViewを仲介する部分
・Target-Action
コントロールオブジェクトから、別のオブジェクトにメッセージの送信と、送信されたメッセージを受け取って処理する仕組み。
使用される場所:ボタン押す>Controllerへ指示
次に、Xcodeを起動して新規プロジェクトの作成を選択。
Windows-Based Applicationを選択。
とりあえず「ビルドして進行」するとiPhoneシミュレーターが立ち上がって白い画面が出たらOK
まずはどのようにアプリケーションが起動して画面が出て行くのかを追ってみよう!
main.m をみるとUIApplicationMainを起動しているだけなのがわかりました。
UIApplicationMainは info.plist 内の MainNibFile 値のインターフェースを起動します。
デフォではMainWindowになっているので、MainWIndow.xibが読み込まれます。
(前回はここの関連が?だった)
MainWindowをダブルクリックするとインターフェースビルダーが起動します。
そこに含まれる4つの項目は以下のような意味をもっています。
・File'sOwner
UIApplicationのインスタンスです。
・First Responder
イベント処理、今はまだ使用しません。
・[アプリケーション名]AppDelegate
アプリケーションのデリゲートインスタンス
・WIndow
実際の画面に表示されるウインド
アプリケーションは起動が完了すると applicationDidFinishLaunching をデリゲートに送信します。
デフォルトで作成されるこのメソッド処理を見てみます。
windowを定義してるだけですね。
次回はここへ、デフォルト以外のViewを追加してみます。
とはいってもDeveloperCenterのiPhoneアプリケーションチュートリアルを実行しながらメモるだけですが :)
まずは最低限必要なCocoaのデザインパターンの説明をざっくりと
・Delegation
オブジェクトが、デリゲートとして指定された別のオブジェジェクトに定期的にメッセージを送信し、入力の要求やイベントの発生を通知するデザインパターン。
このデザインパターンはクラス継承の代替手段として、再利用可能なオブジェクトの機能を拡張するために使用する。
使用される場所:メイン処理の終了感知、ビューのセットアップ&管理、テキストフィールドのReturnイベント処理等
・Model-View-Controller
いわゆるMVC。
Model=データ、オブジェクト
View=ユーザインターフェース部分
Controller=ModelとViewを仲介する部分
・Target-Action
コントロールオブジェクトから、別のオブジェクトにメッセージの送信と、送信されたメッセージを受け取って処理する仕組み。
使用される場所:ボタン押す>Controllerへ指示
次に、Xcodeを起動して新規プロジェクトの作成を選択。
Windows-Based Applicationを選択。
とりあえず「ビルドして進行」するとiPhoneシミュレーターが立ち上がって白い画面が出たらOK
まずはどのようにアプリケーションが起動して画面が出て行くのかを追ってみよう!
main.m をみるとUIApplicationMainを起動しているだけなのがわかりました。
UIApplicationMainは info.plist 内の MainNibFile 値のインターフェースを起動します。
デフォではMainWindowになっているので、MainWIndow.xibが読み込まれます。
(前回はここの関連が?だった)
MainWindowをダブルクリックするとインターフェースビルダーが起動します。
そこに含まれる4つの項目は以下のような意味をもっています。
・File'sOwner
UIApplicationのインスタンスです。
・First Responder
イベント処理、今はまだ使用しません。
・[アプリケーション名]AppDelegate
アプリケーションのデリゲートインスタンス
・WIndow
実際の画面に表示されるウインド
アプリケーションは起動が完了すると applicationDidFinishLaunching をデリゲートに送信します。
デフォルトで作成されるこのメソッド処理を見てみます。
- (void)applicationDidFinishLaunching:(UIApplication *)application {
// Override point for customization after application launch
[window makeKeyAndVisible];
}
windowを定義してるだけですね。
次回はここへ、デフォルト以外のViewを追加してみます。
2008年12月18日木曜日
不思議の国のアプリ(iPhone)
えー、メモリ管理をすっとばして、とりあえず今まで学んだ知識でiPhoneアプリのサンプルがどれぐらい理解できるか挑戦!
XCODEの新規プロジェクトからNavigation-BasedApplicationを作成してみる。
まずは main.m から
あらスッキリ。
NSAutoreleasePoolでメモリ管理をしつつ、UIApplicationMainってのを起動しているだけっぽい?
ではUIApplicationMainを・・・って早速ここからどこにいってるのか・・・
そんなわけでiPhoneDeveloperCenterのGettingStartedを一生懸命斜め読み
どうやらUIApplicationMainからはMainWindow.xibが開かれるって事かな?
xibを開くとインターフェースビルダーが立ち上がる、、、おお、なんかおもしろい
して、このボタンのイベントなどはどこで設定するのやら・・・
うーん何がなんだかサッパリ、、、日本語の情報がほしー
DeveloperCenterの情報は豊富だけど、有料でもいいから日本語がほっすいよん
とりあえず来月日本語本出るみたいだし読んでみようかなー
XCODEの新規プロジェクトからNavigation-BasedApplicationを作成してみる。
まずは main.m から
#import
int main(int argc, char *argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
int retVal = UIApplicationMain(argc, argv, nil, nil);
[pool release];
return retVal;
}
あらスッキリ。
NSAutoreleasePoolでメモリ管理をしつつ、UIApplicationMainってのを起動しているだけっぽい?
ではUIApplicationMainを・・・って早速ここからどこにいってるのか・・・
そんなわけでiPhoneDeveloperCenterのGettingStartedを一生懸命斜め読み
どうやらUIApplicationMainからはMainWindow.xibが開かれるって事かな?
xibを開くとインターフェースビルダーが立ち上がる、、、おお、なんかおもしろい
して、このボタンのイベントなどはどこで設定するのやら・・・
うーん何がなんだかサッパリ、、、日本語の情報がほしー
DeveloperCenterの情報は豊富だけど、有料でもいいから日本語がほっすいよん
とりあえず来月日本語本出るみたいだし読んでみようかなー
登録:
投稿 (Atom)