可变数组值变空

时间:2015-02-28 07:08:00

标签: ios objective-c iphone for-loop nsarray

我有一个包含日期的数组。这是我的阵容。

"2015-03-01",
"2015-03-04",
"2015-03-05",
"2015-03-06",
"2015-03-07",
"2015-03-08",
"2015-03-14",
"2015-03-15"

根据此日期列出值。我的编码是

NSArray * datevalue = [tempArr valueForKey:@"match_formatted_date"];
                NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"self" ascending:YES];
                NSArray *descriptors = [NSArray arrayWithObject: descriptor];
                NSArray *reverseOrder = [datevalue sortedArrayUsingDescriptors:descriptors];

 NSPredicate *findFutureDates = [NSPredicate predicateWithBlock: ^BOOL(id obj, NSDictionary *bind){
NSDateFormatter *df = [[NSDateFormatter alloc]init];
                    [df setDateFormat:@"yyyy-MM-dd"];
                    [df setTimeZone:[NSTimeZone systemTimeZone]];
                    NSDate *dd = [df dateFromString:(NSString *)obj ];
                    return ([[NSDate date] compare:dd] == NSOrderedAscending);
    }];

NSArray * arrFutureDates = [reverseOrder filteredArrayUsingPredicate: findFutureDates];
                NSLog(@"arrFutureDates:%@",arrFutureDates);

for (id item in arrFutureDates)
{
if (![dataArr containsObject:item])
                        [dataArr addObject:item];
}

 [dataArr sortUsingSelector:@selector(localizedCaseInsensitiveCompare:)];

for  (int i= 0; i<[dataArr count]-1; i++)  {

                    for (id item in tempArr)
{
if([@"Mexico: Copa Mexico - Clausura" isEqualToString:[item valueForKey:@"league_name"]]
                           ||[@"Mexico: Liga De Ascenso - Clausura" isEqualToString:[item valueForKey:@"league_name"]]
                           ||[@"Mexico: Primera Division - Clausura" isEqualToString:[item valueForKey:@"league_name"]])

                           if([[dataArr objectAtIndex:i]isEqualToString:[item valueForKey:@"match_formatted_date"]])
{
NSMutableDictionary *tempDic =[[NSMutableDictionary alloc]init];
                                [tempDic setValue: [item valueForKey:@"match_formatted_date"]  forKey:@"match_formatted_date"];
                                [tempDic setValue: [item valueForKey:@"league_name"]  forKey:@"league_name"];



if (![titleheader containsObject:tempDic])

{
[titleheader addObject:tempDic];
}}}}

我的问题是:在标题标题中,空值即将到来。如果我犯了错误,任何人都可以帮助我。

2 个答案:

答案 0 :(得分:0)

检查你的代码,你没有在任何地方初始化titleheader。在那种情况下,它将只是零。 在检查条件之前,初始化并为titleheader分配一些值。 或者我不知道你错过了粘贴代码。

答案 1 :(得分:0)

除了不可读的格式之外,您的代码中几乎没有问题,这可能会导致您的问题:

NSArray* datevalue = [tempArr valueForKey:@"match_formatted_date"];

名称建议tempArrNSArray,但您以NSDictionary的身份访问它。方法-valueForKey:-objectForKey:之间存在差异。前者是与KVC相关的NSObject方法,而后者是用于访问存储对象的NSDictionary方法。他们经常感到困惑,因为NSDictionary调用他们的行为方式相同。

for  (int i= 0; i<[dataArr count]-1; i++)  {

这个for循环会跳过dataArr中的最后一个对象,我认为这不是故意的。这可以通过i < dataArr.counti <= dataArr.count-1修复。

另一个问题 - 与问题无关,但有机会学习:

NSMutableDictionary *tempDic =[[NSMutableDictionary alloc]init];
                            [tempDic setValue: [item valueForKey:@"match_formatted_date"]  forKey:@"match_formatted_date"];
                            [tempDic setValue: [item valueForKey:@"league_name"]  forKey:@"league_name"];


if (![titleheader containsObject:tempDic])

容器中的对象被存储并比较(默认情况下)作为引用,因此-containsObject将始终返回NO - 即使有另一个NSDictionary具有相同的键值对。