EDAMTag(タグ) の並び順に親子関係を反映させる

投稿者: | 2012/09/25

以前、こんな記事を書きました。
今回はそれのタグ版です。

EDAMNotebook と ソート | 極上の人生

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;

 


 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です