以前、こんな記事を書きました。
今回はそれのタグ版です。
EvernoteSDK でタグのリストを取得したあと、タグの並び順をWeb版と同じ様にタグの親子関係を反映した並び順にします。
// セッション EvernoteSession* eSession = [EvernoteSession sharedSession]; // 認証キー NSString* aToken = [eSession authenticationToken]; // とりあえずタグを配列に突っ込む NSArray* tmpTags = [[NSArray alloc] initWithArray:[[eSession noteStore] listTags:aToken]]; // ソートキー格納用の配列 NSMutableArray* keys = [[NSMutableArray alloc] init]; // ソートキーをインデックスにしてタグを格納するハッシュ配列 NSMutableDictionary* mdTags = [[NSMutableDictionary alloc] init]; // タグ配列から1つずつタグを取り出し for ( EDAMTag* tag in tmpTags ) { // タグのparentGuitを取得(これがあれば、そのタグは親タグを持つ NSString* pGuid = [tag parentGuid]; // 親タグクリア EDAMTag* pTag = nil; // 親タグがあった場合 if ( pGuid != nil ) { // 親タグ取得 pTag = [[eSession noteStore] getTag:aToken :pGuid]; } // 親タグ名クリア NSString* pName = @""; // 親タグがあった場合親タグ名を取得 if ( pTag != nil ){ pName = pTag.name; } // 親タグ名とタグ名を連結して、ソートキーを生成 NSString* sortKey = [NSString stringWithFormat:@"%@%@", pName, tag.name]; // 生成したソートキーをソートキー格納用の配列に格納(後で並べ替えする) [keys addObject:sortKey]; // ハッシュ配列にソートキーをインデックスにしてタグを格納 [mdTags setObject:tag forKey:sortKey]; } // 並べ替え後のソートキーを格納する配列 NSArray* sortedKeys = [[NSArray alloc] init]; // ソートキーを昇順で並べ替えて並べ替え後のソートキー格納用配列に格納 sortedKeys = [(NSArray*)keys sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; // 並べ替え後のタグを格納する動的配列 NSMutableArray* sortedTags = [[NSMutableArray alloc] init]; // 並べ替え後のソートキーを順次取り出し for ( NSString* key in sortedKeys ) { // ハッシュ配列からソートキーを使ってタグを取り出し、並べ替え後のタグを格納する動的配列に格納 [sortedTags addObject:[mdTags objectForKey:key]]; } // NSArray にキャストして並べ替え後のタグ配列を返す return (NSArray*)sortedTags;
ポイントはノートブックのときと同じく、ソートキーです。
親タグが無ければ空文字列を、親タグがあれば親タグ名を、タグ名の頭に付与しています。
これにより、親タグの並び順を優先したタグの整列が可能です。
2012.09.26追記
その後、iPhone版とiPad版のEvernote公式アプリを見てみたところ、
なんと公式アプリもタグの並び順はデスクトップ版やWeb版と異なり、親子関係無視で名前順に並んでいるのね。
しかも、そのことについてEvernoteサポートに確認したら「仕様です」と来たもんだ…。
ノートブックはちゃんとスタック反映させているのにね。
それはちょっとどうなの?(=_= )
蛇足
それにしても…前回も思いましたがコメントに「キー」と「ソート」が多くて、何がなんだかわからなくなりますね。
コメントなしでコードだけ見た方がわかりやすいかもしれん…。
そんなわけで、コメントなしは以下の「続きを読む」から。
EvernoteSession* eSession = [EvernoteSession sharedSession]; NSString* aToken = [eSession authenticationToken]; NSArray* tmpTags = [[NSArray alloc] initWithArray:[[eSession noteStore] listTags:aToken]]; NSMutableArray* keys = [[NSMutableArray alloc] init]; NSMutableDictionary* mdTags = [[NSMutableDictionary alloc] init]; for ( EDAMTag* tag in tmpTags ) { NSString* pGuid = [tag parentGuid]; EDAMTag* pTag = nil; if ( pGuid != nil ) { pTag = [[eSession noteStore] getTag:aToken :pGuid]; } NSString* pName = @""; if ( pTag != nil ){ pName = pTag.name; } NSString* sortKey = [NSString stringWithFormat:@"%@%@", pName, tag.name]; [keys addObject:sortKey]; [mdTags setObject:tag forKey:sortKey]; } NSArray* sortedKeys = [[NSArray alloc] init]; sortedKeys = [(NSArray*)keys sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; NSMutableArray* sortedTags = [[NSMutableArray alloc] init]; for ( NSString* key in sortedKeys ) { [sortedTags addObject:[mdTags objectForKey:key]]; } return (NSArray*)sortedTags;