【问题标题】:Use existing NSArray object properties to create a new NSArray for sectioned tableView使用现有的 NSArray 对象属性为分段的 tableView 创建一个新的 NSArray
【发布时间】:2012-03-07 17:53:52
【问题描述】:

所以我有一种经典的情况,我想按月/年对我的 tableView 进行分组。我有一个名为beginDateSearchStringconference 对象成员,我用它来将不同的conference 放入桶中;我的问题是在下一部分中,我尝试使用NSSortDescriptorbeginDate(这是一个日期)对每个存储桶进行排序,但失败了。

我收到与 unsorted 无法接收排序描述符类型选择器相关的错误。

下面是恶心的代码:

- (NSArray *)arrayOfDateSortedEvents {
    NSMutableArray *sortedArray = [[NSMutableArray alloc] init];
    NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];

    //place into buckets

    for (WSConference *conference in self.arrayOfEvents) {
        if (![dictionary objectForKey:[conference beginDateSearchString]]) {
            NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:conference,nil];
            [dictionary setObject:array forKey:[conference beginDateSearchString]];
        }
        else {
            [[dictionary objectForKey:[conference beginDateSearchString]] addObject:conference];
        }
    }

    //sort each bucket by descriptor beginDate

    NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"beginDate" ascending:YES];
    NSArray *sortDescriptors = [NSArray arrayWithObject:descriptor];

    for (NSMutableArray *unsorted in dictionary) {
        [unsorted sortUsingDescriptors:sortDescriptors];
    }

    // now, unkey and add dictionary in order

    while ([dictionary count] > 0) {

        NSString *lowest = nil;

        for (NSMutableArray *array in dictionary) {
            if (!lowest)
                lowest = [[dictionary allKeysForObject:array] objectAtIndex:0];
            else {
                if ([(WSConference *)[array objectAtIndex:0] beginDate] < [[dictionary objectForKey:lowest] beginDate])
                    lowest = [[dictionary allKeysForObject:array] objectAtIndex:0];
            }
        }

        [sortedArray addObject:[dictionary objectForKey:lowest]];
        [dictionary removeObjectForKey:lowest];
    }

    return sortedArray;
}

【问题讨论】:

    标签: iphone nsmutablearray nsarray nsmutabledictionary nssortdescriptor


    【解决方案1】:

    除了排序之外,您可能还想过滤数组。参见 NSPredicate 和 NSArray 方法 -filteredArrayUsingPredicate: 然后创建过滤器创建的 eventArrays 的 eventsByDateArray。然后在用于创建单元格的表格视图委托中,如果一切都正确排序,第一部分将表示 eventArray 中事件的日期,它是 eventsByDateArray 的第一个对象,表格行将包含 eventArray 中的事件.以此类推。

    已添加 您的快速枚举不正确。您通过字典的键进行枚举。所以在你的代码中 unsorted 等于它枚举的每个键。这对每个人来说都是一个很好的教训。您如何“键入”变量并不重要。当 Objective-C 编译时,它会将它们全部转换为 id。所以NSMutableArray *unsorted 不是 NSMutableArray,除非它被分配给 NSMutableArray。如果您将 unsorted 分配给 NSString,它将是一个 NSString。字典的快速枚举器使用键工作。所以,在这种情况下,unsorted 变成了一个 NSString。

    代替:

    for (NSMutableArray *unsorted in dictionary) {
            [unsorted sortUsingDescriptors:sortDescriptors];
        }
    

    你应该有这个:

    for (id key in dictionary) {
        NSMutableArray *unsorted = [dictionary objectForKey:key];
        [unsorted sortUsingDescriptors:sortDescriptors];
    }
    

    【讨论】:

    • 知道为什么它会抛出并表现得好像数组无法接收sortUsingDescriptors?它实际上将其报告为类型NCSF string
    • 什么报告NCSF string.我不知道“它”是什么。
    • 'beginDate' 属性是字符串还是 NSDate?
    • 我看到了你的问题。请参阅上面的修正答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2013-01-12
    • 2011-06-19
    • 1970-01-01
    • 2010-11-04
    相关资源
    最近更新 更多