将NSArray拆分为NSString

时间:2012-12-19 05:00:27

标签: ios xcode uitableview nsmutablearray

我的应用有一个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];

1 个答案:

答案 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];

基本上你是用前一个数组作为对象创建一个数组,而不是向同一个数组添加一个新对象。