我的应用有一个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天有效,但另一方则没有。有什么建议?哦,使用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];
答案 0 :(得分: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];
基本上你是用前一个数组作为对象创建一个数组,而不是向同一个数组添加一个新对象。