0

たくさんの辞書を含むメイン配列があります。私がやりたいのは、割り当てられたタグに従ってすべての辞書を並べ替えることです。辞書は次のようになります。

date = "2012-12-04 20:26:04 +0000";
name = H;
tag = "#J";

メインアレイの外観は次のとおりです。

MAIN_ARRAY 
   - dict1
   - dict2
   - dict3

メイン配列を次のように並べ替えたい:

MAIN_ARRAY
     - tag1
       - dict1
       - dict2
     - tag2
       - dict3

これが私のコードです:

-(NSArray *)returnTagContent {    
    NSArray *tags = [all valueForKey:@"tag"];
    NSMutableArray *adoptTags = [[[NSMutableArray alloc] init] autorelease];
    for (NSString *tagQuery in tags) {
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"tag CONTAINS[cd] %@", tagQuery];
        NSArray *roughArray = [all filteredArrayUsingPredicate:predicate];
        NSArray *tagContent = [[NSSet setWithArray:roughArray] allObjects];
        [adoptTags addObject:tagContent];
    }
    return adoptTags;
}

配列を返しますが、セクションヘッダーに整理したいと思います。これについてはどうすればよいですか?

また、セクションヘッダーのタイトルを返す際に問題が発生する別のコードがあります。

-(NSString *)returnTitleForTags {
    NSString *uniqueTag = nil;
    for (NSArray *tagContent in allTags) {
        uniqueTag = [[[tagContent valueForKey:@"tag"] allObjects] lastObject];
    }
    return uniqueTag;
}

問題?まあ、それは配列のオブジェクトlastObjectを取得するための他のアイデアのせいです。NSString

更新:新しいコードが変更されました。

次のように、ボタンをクリックしたときにセクションを表示するように配列を更新します。

isTagFilterOn=YES;
[self loadSectionsArray];
[self.tableView reloadData];

ここにのコードがありますcellForRowAtIndexPath:

if (isTagFilterOn==YES) {
    NSDictionary *dict = [[sectionsArray objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
    cell.textLabel.text = [dict valueForKey:@"name"];
    cell.detailTextLabel.text = [dict valueForKey:@"date"];
}
else {
    NSString *object = all[indexPath.row];
    cell.textLabel.text = [object valueForKey:@"name"];
    cell.detailTextLabel.text = [object valueForKey:@"tag"];
}

残り

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    if (isTagFilterOn==YES) {
        return [sectionsArray count];
    }
    else {
        return 1;
    }
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if (isTagFilterOn==YES) {
        return [[sectionsArray objectAtIndex:section] count];
    }
    return all.count;
}

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    if (isTagFilterOn==YES) {
        NSDictionary *dict = [[sectionsArray objectAtIndex:section] objectAtIndex:0];
        return [dict objectForKey:@"tag"];
    }
    return nil;
}
4

1 に答える 1

1

テーブルビューデータソースの配列を作成する前に重複する「タグ」を削除すると、作業が簡単になると思います。

// All tags:
NSArray *tags = [mainArray valueForKey:@"tag"];
// Remove duplicates and sort:
tags = [[[NSSet setWithArray:tags] allObjects] sortedArrayUsingSelector:@selector(compare:)];

// Build an "array of arrays (of dictionaries)" as data source:
sectionsArray = [NSMutableArray array];
for (NSString *tag in tags) {
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"tag == %@", tag];
    NSArray *onesection = [mainArray filteredArrayUsingPredicate:pred];
    [sectionsArray addObject:onesection];
}

たとえばmainArray

(
    { date = "2012-12-04 20:26:04 +0000"; name = H; tag = "#J"; },
    { date = "2013-12-04 20:26:04 +0000"; name = X; tag = "#J"; },
    { date = "2014-12-04 20:26:04 +0000"; name = Z; tag = "#L"; }
)

その後sectionsArray

(
    (
        { date = "2012-12-04 20:26:04 +0000"; name = H; tag = "#J"; },
        { date = "2013-12-04 20:26:04 +0000"; name = X; tag = "#J"; }
    ),
    (
        { date = "2014-12-04 20:26:04 +0000"; name = Z; tag = "#L"; }
    )
)

また、セクション内の各セクションと各行に簡単にアクセスできます。

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return [sectionsArray count];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [[sectionsArray objectAtIndex:section] count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = ...;
    }
    NSDictionary *dict = [[sectionsArray objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
    cell.textLabel.text = [dict objectForKey:@"name"];
    cell.detailTextLabel.text = [dict objectForKey:@"date"];
    return cell;
}

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    NSDictionary *dict = [[sectionsArray objectAtIndex:section] objectAtIndex:0];
    return [dict objectForKey:@"tag"];
}
于 2012-12-04T21:58:36.970 に答える