0

사용자 지정 사전 순으로 NSArray를 정렬하려고합니다. 그 거래는 객체의 상태를 포함하는 문자열을 가진 Array를 가졌다는 것입니다.NSSortDescriptor 사용자 지정 영숫자 순서

사용 가능한 상태는 entered, process, ready, done입니다.

정상적으로 (알파벳 순서로) 정렬 할 때 순서가 잘못되었습니다 (완료, 입력, 처리, 준비).

나는 그것을 올바른 방법으로 주문하려면 다음 코드를 시도 :

NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"state" ascending:YES comparator:^(id obj1, id obj2) { 
    if ([obj1 isEqualToString:@"entered"] && [obj2 isEqualToString:@"process"]) { 
     return (NSComparisonResult) NSOrderedAscending; 
    } 
    else if ([obj1 isEqualToString:@"process"] && [obj2 isEqualToString:@"entered"]) { 
     return (NSComparisonResult) NSOrderedDescending; 
    } 
    else if ([obj1 isEqualToString:@"process"] && [obj2 isEqualToString:@"ready"]) { 
     return (NSComparisonResult) NSOrderedAscending; 
    } 
    else if ([obj1 isEqualToString:@"ready"] && [obj2 isEqualToString:@"process"]) { 
     return (NSComparisonResult) NSOrderedDescending; 
    } 
    else if ([obj1 isEqualToString:@"ready"] && [obj2 isEqualToString:@"done"]) { 
     return (NSComparisonResult) NSOrderedAscending; 
    } 
    else if ([obj1 isEqualToString:@"done"] && [obj2 isEqualToString:@"ready"]) { 
     return (NSComparisonResult) NSOrderedDescending; 
    } 
    else { 
     return (NSComparisonResult) NSOrderedSame; 
    } 
}]; 

내가 또한 단어의 바로 첫 글자를 사용하여 시도,하지만 너무 작동하지 않았다.

이 비교기를 사용할 때 resp를 주문하지 않습니다. 배열은 "오래된"순서를 유지합니다.

내가 뭘 잘못 먹었 니? Comparator를 올바르게 이해하지 못했습니까? 도움을

감사합니다, 안부, 줄리안

답변

0

여기에 많은 코드가 있기 때문에 대답해야합니다. 나는 지금 물건을 달리고있다. 하지만 지금 된 버그 재미 버그 :

NSString *str1 = (NSString *)obj1; 
NSString *str2 = (NSString *)obj2; 

if ([str1 isEqualToString:@"entered"] && [str2 isEqualToString:@"progress"]) { 
    return (NSComparisonResult) NSOrderedAscending; 
} 
else if ([str1 isEqualToString:@"entered"] && [str2 isEqualToString:@"ready"]) { 
    return (NSComparisonResult) NSOrderedAscending; 
} 
else if ([str1 isEqualToString:@"entered"] && [str2 isEqualToString:@"done"]) { 
    return (NSComparisonResult) NSOrderedAscending; 
} 
else if ([str1 isEqualToString:@"progress"] && [str2 isEqualToString:@"entered"]) { 
    return (NSComparisonResult) NSOrderedDescending; 
} 
else if ([str1 isEqualToString:@"progress"] && [str2 isEqualToString:@"ready"]) { 
    return (NSComparisonResult) NSOrderedAscending; 
} 
else if ([str1 isEqualToString:@"progress"] && [str2 isEqualToString:@"done"]) { 
    return (NSComparisonResult) NSOrderedAscending; 
} 
else if ([str1 isEqualToString:@"ready"] && [str2 isEqualToString:@"entered"]) { 
    return (NSComparisonResult) NSOrderedDescending; 
} 
else if ([str1 isEqualToString:@"ready"] && [str2 isEqualToString:@"progress"]) { 
    return (NSComparisonResult) NSOrderedDescending; 
} 
else if ([str1 isEqualToString:@"ready"] && [str2 isEqualToString:@"done"]) { 
    return (NSComparisonResult) NSOrderedDescending; 
} 
else if ([str1 isEqualToString:@"done"] && [str2 isEqualToString:@"entered"]) { 
    return (NSComparisonResult) NSOrderedDescending; 
} 
else if ([str1 isEqualToString:@"done"] && [str2 isEqualToString:@"progress"]) { 
    return (NSComparisonResult) NSOrderedDescending; 
} 
else if ([str1 isEqualToString:@"done"] && [str2 isEqualToString:@"ready"]) { 
    return (NSComparisonResult) NSOrderedDescending; 
} 
else { 
    return (NSComparisonResult) NSOrderedSame; 
} 

이 : 나는 순서 방향 (ascending:YES/NO)을 변경있을 때, 방향은 바로 내가 ascending:YES (입력, 진행을 주문하고있어 모든 두 번째 시간입니다, 준비 완료). 그렇지 않으면 입력, 진행, 완료, 준비가 조금 잘못되었습니다.

누구나 상상할 수 있습니까? 아니면 해결책이 있습니까? 심각한 버그는 아니지만 문제를 해결하고 싶습니다.

감사합니다. 먼디,하지만 제 퍼지 스타일을 계속 사용하겠습니다. 나는 Cocoa/Objective C에 대해 매우 익숙합니다. 그리고이 방법은 나에게 더 의미가 있습니다. 그럼에도 불구하고 당신의 노력에 감사드립니다 !!

0

나는 문자열 당신의 계획은 당신이 뭘 하려는지에 적합하지라고 생각합니다. 상태를 기록하려면 다른 데이터 모델을 사용하고 뷰에서 적절한 문자열을 처리하는 것이 훨씬 낫습니다.

typedef enum { 
    entered = 0, 
    processed, 
    ready, 
    done 
} State; 

을 지금 사소하게 정렬 :이처럼 정의하면

는 일반적인 구현은 자동으로 증가하는 enum을 포함한다.

state은 실질적으로 정수인 State이어야합니다. NSDictionary 또는 NSArray를 사용하려면 NSNumber에 포장해야하지만 유형의 @property으로 사용자 정의 객체를 만드는 경우 확실히 읽을 수 있습니다.

+0

안녕하세요. Mundi! 위대한 접근, 감사합니다! 하지만 지금 : NSString (상태 이름 포함)을 _state_ 유형의 객체로 변환하려면 어떻게해야합니까? 내 응용 프로그램이 웹 기반 응용 프로그램의 "그냥"iOS 래퍼이기 때문에 데이터베이스에서 표현을 변경할 수 없습니다. ** 고마워요 **! –

+0

다른 JSON 또는 XML "필드"와 같은 방식입니다. 사용자 객체의 속성과 하나씩 일치시킵니다. 이 경우에는 아마도 if 문의 문자열을 사용해야합니다. – Mundi