Ruby On Railsのact_as_listモジールの機能をCiderへの追加作業をしています。
listブランチの方で作業していて、どんどん変わる可能性があります。
モデルに"position"という属性を追加すると、自動的に番号が入力され、テーブルに表示する時に順番が保たれる様になります。
まだ、番号を付けるだけで移動時の番号の振り直しは対応してませんが、これから実装していきたいと思います。
positionを別の属性にしたい場合はカスタムクラスで、+[NSManagedObject listAttributeName]を書き換えて適切な属性の名前を返す様にして下さい。
scopeを用いる場合は+[NSManagedObject listScopeName]を書き換えて、リレーション名を返す様にして下さい。
リレーション先毎に番号が割り振られます。
追記:
willSaveで処理してますが、awake...で処理した方が良いと思い試してみましたが、この時点ではまだscopeで設定されたリレーションが設定されていないので、うまく行きそうになかったです。
KVOを使ってscopeで設定されたリレーションが設定された時に処理する様にしてみましたが、複雑になって来て簡単に行きそうでなかったので、見送りました。
2009年8月27日木曜日
2009年8月6日木曜日
Cider 0.2.0リリースしました
CiderにCoreData検索用メソッドを追加しました。
テストコードにありますが、データはこの様に準備します。
検索はこの様に出来ます。
全件検索なら
絞り込み(複数件数)
絞り込み(1件)
Objective-CなのでRailsほどスッキリする訳ではありませんが、素のCoreDataを使うよりは幾分スッキリすると思います。
テストコードにありますが、データはこの様に準備します。
[[ISMovie create] setTitle:@"Star Wars IV"];
[[ISMovie create] setTitle:@"Star Wars VI"];
[[ISMovie create] setTitle:@"Star Wars V"];
検索はこの様に出来ます。
全件検索なら
NSArray *result = [ISMovie findAll:nil error:NULL];
絞り込み(複数件数)
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"title BEGINSWITH %@", @"Star Wars"];
NSArray *sortDescriptors = [NSSortDescriptor sortDescriptorsWithString:@"title asc"];
NSArray *result = [ISMovie findAllWithPredicate:predicate sortDescriptors:sortDescriptors error:NULL];
絞り込み(1件)
NSError *error = nil;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"title = %@", @"Star Wars IV"];
NSArray *sortDescriptors = [NSSortDescriptor sortDescriptorsWithString:@"title desc"];
ISMovie *movie = [ISMovie findWithPredicate:predicate sortDescriptors:sortDescriptors error:NULL];
Objective-CなのでRailsほどスッキリする訳ではありませんが、素のCoreDataを使うよりは幾分スッキリすると思います。
2009年8月3日月曜日
Cider 0.1.3リリースしました
CiderにNSManagedObjectContextとNSManagedObjectの生成用のメソッドを追加しました。
良かったら使ってみて下さい。
NSManagedObjectContextの生成は幾つかの手順を踏む必要があります。
最も簡単な構成であれば、手順は同じなのでメソッド1つで生成出来る様にしました。
+ (id)defaultManagedObjectContextでアプリケーションで共通に使えるNSManagedObjectContextが得られます。
保存先を指定したい場合は+setDefaultStoreURL、+setDefaultStoreFile:を使用します。
この他にも、-managedObjectContextWithURL: 、-managedObjectContextWithFile:もあります。
NSManagedObjectもカスタムクラスを用いた場合は+creatで得られるので簡単です。
(この場合は[NSManagedObjectContext defaultManagedObjectContext]が用いられます)
今後はfind系の所に手を入れたいと思ってます。
まだ考えがまとまっていないので、公開出来るのはまだまだ先になると思います。
良かったら使ってみて下さい。
NSManagedObjectContextの生成は幾つかの手順を踏む必要があります。
最も簡単な構成であれば、手順は同じなのでメソッド1つで生成出来る様にしました。
+ (id)defaultManagedObjectContextでアプリケーションで共通に使えるNSManagedObjectContextが得られます。
NSManagedObjectContext *context = [NSManagedObjectContext defaultManagedObjectContext];
保存先を指定したい場合は+setDefaultStoreURL、+setDefaultStoreFile:を使用します。
この他にも、-managedObjectContextWithURL: 、-managedObjectContextWithFile:もあります。
NSManagedObjectもカスタムクラスを用いた場合は+creatで得られるので簡単です。
(この場合は[NSManagedObjectContext defaultManagedObjectContext]が用いられます)
// IOMovieはカスタムクラス
IOMovie *movie = [IOMovie create];
今後はfind系の所に手を入れたいと思ってます。
まだ考えがまとまっていないので、公開出来るのはまだまだ先になると思います。
2009年8月1日土曜日
Cider 0.1.1リリースしました
CiderにNSErrorを拡張するコードを追加しました。
特にCoreDataを用いているとNSErrorを扱う機会が増えて来ます。
また、CoreDataが返すNSErrorにはエラーがネストした状態で返って来ます。
この中から、自分が扱いたいドメインのエラーを返したり、エラー内容をUIAlertViewに表示させるメソッドを追加しています。
NSManagedObjectクラスを継承したクラスでvalidationを書きます。
この時にdomainを独自のドメイン(MyDomain)のNSErrorオブジェクトを返します。
-save:で返るerrorはCoreDataのドメインの場合があり、MyDomainのエラーはその中にネストされた状態で返る事があります。
-showErrorForDomain:でMyDomainを指定する事で、-validatePortNo:で返したエラーを捕まえる事が出来き、そのままUIAlertViewに表示します。
特にCoreDataを用いているとNSErrorを扱う機会が増えて来ます。
また、CoreDataが返すNSErrorにはエラーがネストした状態で返って来ます。
この中から、自分が扱いたいドメインのエラーを返したり、エラー内容をUIAlertViewに表示させるメソッドを追加しています。
NSManagedObjectクラスを継承したクラスでvalidationを書きます。
この時にdomainを独自のドメイン(MyDomain)のNSErrorオブジェクトを返します。
- (BOOL)validatePortNo:(id *)ioValue error:(NSError **)error
{
NSInteger value = [*ioValue intValue];
if (value < 1000 || value > 65535) {
NSDictionary *userInfoDict = [NSDictionary dictionaryWithObject:@"1000から65535までにして下さい" forKey:NSLocalizedDescriptionKey];
*error = [NSError errorWithDomain:@"MyDomain" code:1000 userInfo:userInfoDict];
return NO;
} else {
return YES;
}
}
-save:で返るerrorはCoreDataのドメインの場合があり、MyDomainのエラーはその中にネストされた状態で返る事があります。
-showErrorForDomain:でMyDomainを指定する事で、-validatePortNo:で返したエラーを捕まえる事が出来き、そのままUIAlertViewに表示します。
NSError error = nil;
[self.managedObjectContext save:&error]
if (error) {
[error showErrorForDomain:@"MyDomain"];
}
2009年7月30日木曜日
Cider公開しました
本日、iPhoneソフト用ライブラリーCiderをgithubに公開しました。
とは言うものの、今の所はISTableViewCellクラスしかありません。
今後、便利に使えそうなクラスを追加してフレームワーク的にしていければと思っています。
http://github.com/katsuyoshi/cider/tree/master
さて、ISTableViewCellは、UITableViewCellをテキストの編集が出来る様に拡張したクラスです。
UITableViewCellで用意されているスタイル(レイアウト)そのままで編集が出来る様になります。
UITableViewCellのサブクラスを(別途)用意したり、IBでデザインする事なくテキストの編集が出来る様になるので便利ではないでしょうか。
使い方は簡単で、UITableViewCellを使う様に、ISTableViewCellのインスタンス化時にISTableViewCellEditingStyle...から始まるstyleを指定するだけです。(ISTableViewCell.hに定義があります)
下はサンブルのUITableViewCellSampleを実行した時のスクリーンショットです。
上の4つのセルは従来のUITableViewCellで、下の4つがISTableViewCellになっていて、テキストの編集が出来ます。

気になる点/注意点
もともと、UITextFieldがhighlightedを想定した作りになっていない様なので、highlightさせる事は少ないのではないかと思うので、保留とさせて下さい。
(妙案がありましたら教えて下さい)
追記:
UITableViewのstyleがUITableViewStylePlainかUITableViewStyleGroupedのどちらが使用されているかは、ISTableViewCellのsuperview(=UITableView)で判断しています。
しかし、作り方に依ってsuperviewが得られない場合があり、フォントサイズが適切なサイズにならない場合があります。
その場合は明示的にフォントを指定して下さい。
デフォルトのフォントサイズは次の様になります。
UITableViewStylePlain
UITableViewStyleGrouped
とは言うものの、今の所はISTableViewCellクラスしかありません。
今後、便利に使えそうなクラスを追加してフレームワーク的にしていければと思っています。
http://github.com/katsuyoshi/cider/tree/master
さて、ISTableViewCellは、UITableViewCellをテキストの編集が出来る様に拡張したクラスです。
UITableViewCellで用意されているスタイル(レイアウト)そのままで編集が出来る様になります。
UITableViewCellのサブクラスを(別途)用意したり、IBでデザインする事なくテキストの編集が出来る様になるので便利ではないでしょうか。
使い方は簡単で、UITableViewCellを使う様に、ISTableViewCellのインスタンス化時にISTableViewCellEditingStyle...から始まるstyleを指定するだけです。(ISTableViewCell.hに定義があります)
cell = [[[ISTableViewCell alloc] initWithStyle:ISTableViewCellEditingStyleDefault reuseIdentifier:CellIdentifier] autorelease];
下はサンブルのUITableViewCellSampleを実行した時のスクリーンショットです。
上の4つのセルは従来のUITableViewCellで、下の4つがISTableViewCellになっていて、テキストの編集が出来ます。

気になる点/注意点
- ハイライト時のアニメーション処理をしていないため、文字の色が戻る時に時差があります。
- textFieldのtextColorを変更する場合はcellに対して設定します。(UITextFieldがhighlightedTextColorを持っていないため)
-initWithStyle:reuseIdentifier:でISTableViewCellStyle...から始まるstyleを指定するとUITableViewCellのインスタンスを返します。ISTableViewCellのつもりでtextField/detailTextFieldにアクセスすると例外が発生します。サブクラスを作る時に混乱するのでISTableViewCellを返す様にしました。
もともと、UITextFieldがhighlightedを想定した作りになっていない様なので、highlightさせる事は少ないのではないかと思うので、保留とさせて下さい。
(妙案がありましたら教えて下さい)
追記:
UITableViewのstyleがUITableViewStylePlainかUITableViewStyleGroupedのどちらが使用されているかは、ISTableViewCellのsuperview(=UITableView)で判断しています。
しかし、作り方に依ってsuperviewが得られない場合があり、フォントサイズが適切なサイズにならない場合があります。
その場合は明示的にフォントを指定して下さい。
cell.textField.font = [UIFont boldSystemFontOfSize:17];
デフォルトのフォントサイズは次の様になります。
UITableViewStylePlain
- ISTableViewCellStyle(Editiing)Default
- textLabel(textField): 20
- detailTextLabel(detailTextField): -
- ISTableViewCellStyle(Editiing)Value1
- textLabel(textField): 20
- detailTextLabel(detailTextField): 20
- ISTableViewCellStyle(Editiing)Value2
- textLabel(textField): 13
- detailTextLabel(detailTextField): 15
- ISTableViewCellStyle(Editiing)Subtitle
- textLabel(textField): 18
- detailTextLabel(detailTextField): 14
UITableViewStyleGrouped
- ISTableViewCellStyle(Editiing)Default
- textLabel(textField): 17
- detailTextLabel(detailTextField): -
- ISTableViewCellStyle(Editiing)Value1
- textLabel(textField): 17
- detailTextLabel(detailTextField): 17
- ISTableViewCellStyle(Editiing)Value2
- textLabel(textField): 13
- detailTextLabel(detailTextField): 15
- ISTableViewCellStyle(Editiing)Subtitle
- textLabel(textField): 18
- detailTextLabel(detailTextField): 14
登録:
投稿 (Atom)