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

2011年10月15日土曜日

アプリのvalidationで失敗したら

XCodeを4.2にアップデートしたら過去のアプリがvalidationに失敗するようになってしまいました。以下のようなメッセージが出ます。

application executable is missing a required architecture. At least one of the following architecture(s) must be present: armv6

XCodeを更新したことでarmv7のアーキテクチャ(のみ)でビルドしようとするようになったらしく、古いバージョンまでサポートするように(Deployment targetを4.0にする、など)設定していると、ダメだよ!と言われるようです。

「Build setting」の「Architectures」を見ると「$(ARCHS_STANDARD_32_BIT)」となっていて、これがarmv7を指しているみたい。
なのでここに「+」して「armv6」を追加してやります。
これでvalidationが通るようになります。

2番目の回答が今回の解決方法に相当します。


2011年10月13日木曜日

Bing APIで検索してみよう

画像検索用のAPIはいくつか公開されていますが、Bingはその中でも簡単に使えて制限が少ないと思います。


何はともあれまずはAppIDが必要になるので、こちらから登録しておきます。
AppIDを取得したら

http://api.search.live.net/json.aspx?Appid=(AppID)&query=(検索文字)&sources=(検索対象)

とGETしてやれば結果がJSONで返ってきます。

sorcesには以下のように種類があります。詳細はドキュメントを参照してください。

web、image、video、newsなどなど。

oasisの画像検索をしたい場合は

http://api.search.live.net/json.aspx?Appid=(AppID)&query=oasis&sources=image

となります。


iPhoneアプリで利用する場合、ほぼ確実に年齢制限が必要になるのでAppStoreにリリースする際はちゃんと設定しましょう(リジェクトされます)。

2011年10月4日火曜日

[iOS]突然シミュレータ上で起動しなくなる場合

クリーンしてからビルドし直してシミュレータで起動しようとしたところ、アプリが起動しようとしたところでクラッシュ。
何度もやり直してもダメ。
コンソールには以下のようなメッセージが残っています。

app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle〜(省略)〜

MainWindow.nibが読み込めませんでした、というようなことを言っているのだけどさっぱり理由が分からない。そんなんいじってない。
なんで、こうなったのかはさっぱり分からないのだけど、とりあえず解決したのでメモ。。。

1) プロジェクト名/ja.lproj と en.lprojフォルダにある「MainWindow.xib」を2つともファイルインスペクターに追加する

2) ビルドする

で、OK。
なんかの拍子でプロジェクトから消えてしまうらしい。。。
誤ってDeleteでも押したんだろうか。。。


2011年10月1日土曜日

[iOS]UITableViewを下に引っ張って更新するUI


Twitterクライアントでよく見かけるテーブルを下に引っ張るとアイコンが回転してロード中を示すUIがあります。
左の画像みたいなもの。

これを実現する便利なライブラリは2つあります。

1つ目は「PullToRefresh」というもの。
左の画像は「PullToRefresh」のGitHubのReadmeから引っ張って来たものです。
簡単なのはこちらで、Readmeに書いてある通り(英語ですが迷わない程度に簡単です)です。
ごくごく簡単なサンプルも付属しているので、こちらも併せて読めば簡単です。
でもこれはUITableViewControllerを拡張する形になっているので、複数のパーツから構成されている画面に存在するUITableViewを拡張したい、というケースでは使えません。

そういうケースでは「EGOTableViewPullRefresh」を使います。

1)EGORefreshTableHeaderView.h/mをコピーする
2)FrameworkにQuarzCoreを追加する
3)対象のUITableViewを持つControllerクラスでEGORefreshTableHeaderDelegateの実装を宣言
4)同様にUIScrollViewDelegateも実装宣言する
5) EGORefreshTableHeaderViewのインスタンス変数を定義
6)下記のような感じで初期化する
  EGORefreshTableHeaderView *view = [[EGORefreshTableHeaderView alloc]
initWithFrame:CGRectMake(0.0f, 0.0f - self.tableView.bounds.size.height,
self.view.frame.size.width, self.tableView.bounds.size.height)];
view.delegate = self;
[self.tableView addSubview:view];
_refreshHeaderView = view;
[view release];
[_refreshHeaderView refreshLastUpdatedDate];
 最後のrefreshLastUpdatedDateは引っ張ったときに出てくる最終更新日時を設定するものです。適宜呼んでやりましょう。

7) UIScrollViewのdelegateを以下のように実装する
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
[_refreshHeaderView egoRefreshScrollViewDidScroll:scrollView];
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
[_refreshHeaderView egoRefreshScrollViewDidEndDragging:scrollView];
}
8)
EGORefreshTableHeaderDelegateで定義されるメソッドを実装する
- (void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView*)view
 ※ロード中アイコンが表示されている間にやっておきたい処理を実装する(非同期で)
- (BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView*)view
 ※ロード中かどうかをBOOL値で返す(NOを返したタイミングでロード中解除)
- (NSDate*)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView*)view
 ※最終更新日時を返す。基本的には[NSDate date]しておけばよい


2011年7月27日水曜日

UITableVIewのセルの色を変えたい

UITableViewのセルの色を変えたり、透過させたい、という比較的稀な(?)ことをやってみたいことがありますが、単純にbackgroundColorを指定しても反映されません。
独自のセルを用意した場合も同様で、いくらInterfaceBuilder上で色を設定してみてもテーブルに表示されるころには白くなっています。
これはUITableViewが強制的に色を統一してくるからです。

色を変えるためにはセルを描画する直前に呼ばれるtableView willDisplayCellをオーバーライドしてやります。


- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell*)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
 if (indexPath.row % 2) {
  cell.backgroundColor = [UIColor colorWithRed:0.9 green:0.9 blue:0.9alpha:1.0];
 }
}

例えばこんな風にしてやれば一行おきにちょっと暗い色にできます。

2011年7月25日月曜日

UIImagePickerControllerでカメラを表示するとViewが破棄される

とある画面からUIImagePickerControllerをカメラモードで起動した後に戻ってくると、その画面が初期化されてしまう、ということがあります。
ユーザー操作で設定情報を覚えていたのにカメラから戻ってきた途端に初期化されて忘れてしまう、ということになってしまう困ったぞ、と。

このときデバッグで起動するとコンソールに「Received memory warning」というメッセージが出ていて、これはメモリ警告が発生したことを表しています。メモリを使い過ぎ、ということなのでiOSはviewを破棄してしまいます。なので、カメラから戻って来たときにviewの生成から始まってしまい初期化されてしまう、という現象。

メモリ警告は「didReceiveMemoryWarning」というメソッドで通知されるので、ここで必要な情報は別領域に退避してやって、再生成時に復元してやる必要があります。