NSSortDescriptor с именем и фамилией или с именем или фамилией?

Я делаю сортировку массива контактной информации, он отлично работает, когда я ввожу имя и фамилию для определенного контакта, но он не работает нормально, когда какой-либо из них отсутствует,

Например: если я ввожу имя Джон и фамилию Микки, то он дает правильную сортировку, но если я ввожу только Микки, то он наконец появляется в разделе # в UITableview, так что мне нужно сделать здесь в этом случае .

Мой код, как показано ниже,

NSSortDescriptor *sortDescriptorFirstName = [[[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:YES selector:@selector(localizedStandardCompare:)] autorelease];

NSSortDescriptor *sortDescriptorLastName = [[[NSSortDescriptor alloc] initWithKey:@"lastName" ascending:YES selector:@selector(localizedStandardCompare:)] autorelease];

NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptorFirstName,sortDescriptorLastName,nil];

if(favFlag){
    favContacts = [[contactsData sortedArrayUsingDescriptors:sortDescriptors] mutableCopy];
    [self setListContent:favContacts];
}
else {
    contacts = [[contactsData sortedArrayUsingDescriptors:sortDescriptors] mutableCopy];
    [self setListContent:contacts];
}

[contactTableView reloadData];

person Vishwa Patel    schedule 14.12.2012    source источник


Ответы (1)


Если у вас есть пользовательские критерии, вы можете использовать блоки сравнения вместо дескрипторов. Например, вы можете использовать sortedArrayUsingComparator:

contacts = [contactsData sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    NSString *sortName1 = [self sortNameWithFirst:[obj1 objectForKey:@"firstName"]
                                             last:[obj1 objectForKey:@"lastName"]];

    NSString *sortName2 = [self sortNameWithFirst:[obj2 objectForKey:@"firstName"]
                                             last:[obj2 objectForKey:@"lastName"]];

    return [sortName1 caseInsensitiveCompare:sortName2];
}];

Где у меня есть этот небольшой служебный метод, чтобы упростить создание «имени сортировки», моего термина для строки, по которой я в конечном итоге собираюсь сортировать:

- (NSString *)sortNameWithFirst:(NSString *)firstName last:(NSString *)lastName
{
    if (firstName && lastName)
        return [NSString stringWithFormat:@"%@ %@", firstName, lastName];
    if (firstName)
        return firstName;
    if (lastName)
        return lastName;
    return nil;
}

Этот код принимает этот список:

NSArray *contactsData = @[
    @{@"firstName":@"Rob", @"lastName":@"Zimmer"},
    @{@"firstName":@"Sting"},
    @{@"firstName":@"Rob", @"lastName":@"Ryan"},
    @{@"firstName":@"Cher"},
    @{@"lastName":@"Smith"}
];

И дает мне «Шер», «Роб Райан», «Роб Циммер», «Смит» и «Стинг».

Честно говоря, мне не совсем понятно, как вы хотели отсортировать его на основе вашего вопроса, но вы поняли. Блок компаратора sortedArrayUsingComparator дает вам возможность создавать любые пользовательские критерии сортировки, которые вы хотите. Ему просто нужно вернуть один из NSComparisonResult значений NSOrderedAscending, NSOrderedSame или NSOrderedDescending (которые я удобно использую caseInsensitiveCompare для создания для меня). Список вариантов поиска см. в Сортировка методов, перечисленных в Справочнике классов NSArray.

person Rob    schedule 14.12.2012