1

私のアプリには、TableView日ごとに並べ替えられたブログ記事のリストがあります。記事の行が選択されると、記事のタイトルが に追加されますNSUserDefault NSMutableArray。ビューが更新されると、アプリは配列NSPredicateを取得し、記事のタイトルに一致する配列内のアイテムの配列を並べ替えるために使用し、タイトルが一致する場合はチェックマークを追加します。問題は、私がそれを使用しているためNSString、行の1つにのみチェックマークを追加することです...への最新のエントリに関係なくNSMutableArray。これが私のコードですcellForRowAtIndexPath:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

RSSEntry *entry = [_allEntries objectAtIndex:indexPath.row];
NSArray *rowsarray = [defaults objectForKey:@"checkedrows"];

NSPredicate *predicate = [NSPredicate predicateWithFormat: @"SELF contains[cd] %@",  entry.date];

NSArray *filteredArray = [rowsarray filteredArrayUsingPredicate: predicate];
NSString *myString = [filteredArray componentsJoinedByString:@""];

NSLog(@"The array %@", filteredArray);
NSLog(@"The string %@", myString);

if([entry.date isEqualToString:myString])
{
   cell.accessoryType = UITableViewCellAccessoryCheckmark;

}

コンソールでは、配列内の項目ごとに 1 回ずつ、MYSTRING が複数回出力されますが、最初に返された記事のタイトルの行にチェックマークが追加されるだけです。配列内のすべてにチェックマークを追加するにはどうすればよいですか?

更新: 上記のログを追加してfilteredArray、文字列を出力しました。エラーが見つかりました。配列の最初の項目を取得し、entry.date と一致するようにフォーマットしているようですが、2 番目はそうではありません。これがコンソールの出力です。

The array (
    "Day 2: "
)


The string Day 2:


The array (
        (
        "Day 1: "
    )
)



The string (
    "Day 1: "
)

ご覧のとおり、コンソールには 1 日目と 2 日目で異なるものが表示されます。2 日目は機能しますが、もう一方は機能しません。助言がありますか?ああ、また、NSPredicateショーを使用する前の元の配列

(
        (
        "Day 1: "
    ),
    "Day 2: "
)

componentsJoinedByString の述語または文字列を編集する必要があるのでしょうか。

アップデート:

に値を追加するためのコードNSUserDefaults

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
NSMutableArray *rowsarray2 = [[NSMutableArray alloc] initWithObjects:[defaults objectForKey:@"checkedrows"], nil]; 
[rowsarray2 addObject:entry.date]; 
[defaults setObject:rowsarray2 forKey:@"checkedrows"]; 
[defaults synchronize];
4

1 に答える 1

1

印刷したように、データ構造はどちらの場合も同じではありません。元の配列自体は、最初の要素が文字列の別の配列を持つ配列であり、2 番目の要素が単なる文字列であることを示しています。したがって、フィルタリングと結合中に( "Day 1: " )、文字列を期待している配列を表すものを取得しています"Day 1: "。元の配列がこの種のデータ構造を持っている理由を確認してください。

コードが機能するためには、代わりに

(
        (
        "Day 1: "
    ),
    "Day 2: "
)

そのはず、

(
    "Day 1: ",
    "Day 2: "
)

したがって、方法を変更する必要があります。オブジェクトを に追加していますNSUserDefaults

それ以外の、

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
NSMutableArray *rowsarray2 = [[NSMutableArray alloc] initWithObjects:[defaults objectForKey:@"checkedrows"], nil]; 
[rowsarray2 addObject:entry.date]; 
[defaults setObject:rowsarray2 forKey:@"checkedrows"]; 
[defaults synchronize];

これを試して、

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
NSMutableArray *rowsarray2 = [NSMutableArray arrayWithArray:[defaults objectForKey:@"checkedrows"]]; 
[rowsarray2 addObject:entry.date]; 
[defaults setObject:rowsarray2 forKey:@"checkedrows"]; 
[defaults synchronize];

基本的に、同じ配列に新しいオブジェクトを追加するのではなく、以前の配列をオブジェクトとして使用して配列を作成していました。

于 2012-12-19T05:24:53.807 に答える