1

我的应用程序有一个TableView博客文章列表,按天排序。选择文章的行时,它将文章的标题添加到NSUserDefault NSMutableArray. 当视图刷新时,应用程序获取数组,用于NSPredicate对数组中与文章标题匹配的项目进行排序,如果标题匹配,它会添加一个复选标记。问题是因为我使用NSString它只在其中一行添加一个复选标记......无论是最近的条目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;

}

在控制台中,MYSTRING 被打印多次,数组中的每个项目打印一次,但只在第一个返回的文章标题的行上添加一个复选标记。我怎样才能让它为数组中的每个添加复选标记?

更新:我添加了上面的日志以打印出filteredArray然后是字符串。我发现了错误,它似乎正在获取数组中的第一项并以与 entry.date 匹配的方式对其进行格式化,但第二项不是。这是控制台中的打印输出。

The array (
    "Day 2: "
)


The string Day 2:


The array (
        (
        "Day 1: "
    )
)



The string (
    "Day 1: "
)

如您所见,控制台显示的第 1 天与第 2 天不同。第 2 天有效,但另一天无效。有什么建议么?哦,还有,原来的Array使用前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

正如您所打印的,两种情况下的数据结构都不相同。原始数组本身表明,第一个元素是一个带有另一个字符串数组的数组,第二个元素只是一个字符串。因此,在过滤和加入时,您将得到( "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 回答