以前、こんな記事を書きました。
今回はそれのタグ版です。
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;