2013-03-17
NSUserDefaultsを使ってデータを保存
objective-c | | ![]()
アプリ内でデータを保存する場合にCoreDataを使うという手もありますが、
テーブル定義が〜とか定義を変更した時にマイグレーション処理が〜など色々とめんどいので、
代わりにNSUserDefaultsを使って比較的楽に保存する方法があります。
NSUserDefaultsは、iPhoneやiPadのアプリの設定画面の情報を
取得したり設定できるクラスです。
二郎系アプリでは設定画面は用意していませんが、
NSUserDefaultsを使ってお気に入り機能を実装しました。
お気に入り登録したお店情報リスト(NSData)をまるっと保存しています。
・保存時
//お店情報リスト NSArray *shopList = [NSArray arrayWithObjects:@"お店1", @"お店2", @"お店3", nil]; NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; //お店情報リスト(NSArray)をデータ化(NSData) NSData *shopData = [NSKeyedArchiver archivedDataWithRootObject:shopList]; //shopListキーを指定してデータを保存 [defaults setObject:shopData forKey:@"shopList"]; if (![defaults synchronize]) { NSLog(@"defaults setObject error"); return; }
・取得時
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; //shopキーのデータを取得 NSData *shopData = [defaults dataForKey:@"shopList"]; //データをリスト化 NSArray *shopList = [NSKeyedUnarchiver unarchiveObjectWithData:shopData];
2013-03-16
繰り返し学習時間を記録するiOSアプリ「StudyLap」をリリースしました
問題集などで繰り返し学習する際、問題を解いた時間を記録し並べて表示できる
iOSアプリ「StudyLap」をリリースしました。
基本的にはラップ付きタイマーと同じですが、1回目、2回目・・・と繰り返し
問題を解いた後、問題ごとに解いた時間の比較しやすいように横に並べて表示します。
・画面
また、問題ごとにアラーム設定ができるので、
例えば1問3分みたいに目標解答時間を設定して、時間内に解けなかったら
アラームを鳴らすという使い方ができます。
おまけで記録時間のメール送信機能を付けました。
デフォルトではミリ秒は表示されませんが、
iOSの設定 -> StudyLap -> ミリ秒を表示
でオンオフの切り替えができます。
ぜひ、ご活用ください。
2013-01-03
OS移行時にカスペルスキーのアクティベーションでトラブル → サポセンで解決
その他 | | ![]()
先日、興味本位でWindows8 Pro 64bitを使ってみたくて、
現行のWindow7 Home 32bitから変えてみました。
そこで、使用中の「カスペルスキー 2013 マルチプラットフォーム セキュリティ」
(3年3台使えるやつ)のアクティベーションを解除してWindows8をインストール。
インストール完了後にカスペルスキーをインストール&アクティベーションしようとしたら
「すでにアクティベーション数を超えています」みたいなエラーが表示されて弾かれました。
いや、3台もアクティベーションしてないし、さっき1個解除したし…。
と、心の中で叫んでも一向に解決しないので、マイカスペルスキーの
テクニカルサポートセンターにフォームで問い合わせしました。(要アカウント作成)
実はカスペルスキー製品のサポートページは、カスペルスキーストアにも似たようなページがあって迷いました。
ストア側のページではどうも対応出来なさそうだったので、マイカスペルスキーで以下の手順で進めました。
- アカウントを作成
- ログイン
- 画面左のメニューから「アクティベーションコードを管理」を選択
- アクティベーションコードを追加
- 画面左のメニューから「お問い合わせの送信」
- お問い合わせ送信タブを選択して、お問い合わせ作成ボタンをクリック
大体、中1日くらいで返信が来ました。
結局、直接の原因は分かりませんでしたが、何かのタイミングでアクティベーションが解除できなくなる不具合があるそうです。
こちらではどうしようも出来ないので、新しいアクティベーションコードを発行していただきました。
旧コードは使えなくなるので再度設定が必要ですが。
サポートの対応も好感が持てたので、不満は残らず無事解決出来て良かったです。
Windows8は結局使いこなせなくてWindows7に戻してみたり、
無駄な作業が増えまくった年末でした。
うーん、OSのインストールは鬼門か…。
2013-01-02
任意にタブバー内の指定のタブに移動する方法
iOS, objective-c | | ![]()
ボタンタップ時などの任意の処理でタブバーの表示タブを切り替える方法です。
TabBarControllerに対して、以下のように複数のTabBarが設定されている状態とします。
TabBar内のViewControllerからUITabBarControllerにアクセスできるので、
UITabBarControllerの選択状態を設定できます。
まずはインデックスを設定する方法。
TabBarのインデックスは左のタブから0, 1, 2...と設定されているので、
一番左を表示したい場合は0を設定します。
上のイメージだとCurrentタブ切り替わります。
・選択インデックスを設定して表示切替
//0 = 一番左のTabBarを設定 self.tabBarController.selectedIndex = 0;
他にも、あまり使う頻度はないかもしれませんが、
子ViewControllerでNavigationControllerのrightBarButtonItemの処理を実装している場合、
実装されている子ViewControllerのタブに切り替えるには以下のようにします。
・選択ViewControllerを設定して表示切替
//実装されているViewControllerを設定(ViewControllerのViewを表示) self.tabBarController.selectedViewController = self;
処理がListタブのViewControllerに実装されていれば、他のタブを表示していても
Listタブに切り替わります。
2013-01-01
UITableViewCellの右側にイメージを表示する方法
iOS, objective-c | | ![]()
以前、二郎系ではラーメンの画像をリストの左側に表示していました。
お店が増えるに従って表示される画像の比率が低くなり、見栄えも悪くなってしまったので、
店名を左に詰めて画像があれば右側に表示するように修正しました。
その時の対応です。
UITableViewCellはaccessoryViewというUIViewを持っています。
「>」なんかが表示される部分ですね。
完結に書くと、そこにごっそりUIImageViewを設定します。
//TableViewCellを設定 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { //iOS5.1ではエラーになるので、以前のメソッドに戻す // UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"]; if (!cell) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"]; } [self configureCell:cell atIndexPath:indexPath]; return cell; } - (void)configureCell:(ImageTableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath { UIImage *image = [UIImage imageNamed:@"star.png"]; UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; //画像が大きい場合にはみ出さないようにViewの大きさを固定化 imageView.frame = CGRectMake(0, 0, 30, 30); //アクセサリービューにイメージを設定 cell.accessoryView = imageView; }
結果
実際のコードは、サーバーから非同期で画像データを取得して設定しています。







