2012-08-13 4 views
2

나는 아주 간단한 문제가있다. 그러나 그 해결책은 매우 애매하다.열거 형에 NSComboBox 바인딩?

여기에 내가 가진 무엇 :

typedef { foo, bar, baz} EnumType; 

@interface SomeObject: NSObject 
@property EnumType someEnumValue; 
@end 

... 그리고 [object_controller 선택] 인스턴스의 someEnumValue의 캐릭터 이름을 표시해야 object_controller와 NSComboBox와보기를.

열거 형 값의 이름에 문자열로 직접 액세스 할 수 없다는 것을 알고 있습니다. 열거 형 값의 이름을 보유하고있는 NSArray 만들기 시도하고 ContentValues ​​속성을 바인딩 -이 속성 문자열 콤보 상자를로드합니다 있지만 선택한 인스턴스의 열거 형 값을 관련시킬 방법을 찾을 수 없습니다. 콤보 상자의 값으로

또한 NSValueTransformer를 사용하여 열거 형 값을 NSStrings로 또는 그 반대로 변환하려고 시도했지만 나에게 익숙하지 않아 작동하지 않습니다. 이러한 시도의 대부분은 예외가 발생합니다.

이 사소한 작업은 내 인생에서 약 3 시간 빨려 왔습니다. 도움! 고맙습니다!

답변

1

문제점을 해결하기 위해 내가 생각할 수있는 두 가지 접근 방법이 있습니다.

  1. 열거 형과 동일한 순서로 문자열을로드하십시오. "indexOfSelectedItem"에 대한 NSComboBox를 쿼리하면 나머지는 열거 형 값을 제공합니다. (주의 : enum이 0부터 시작하는 경우에만 작동합니다. 예를 보면서 생각한 것 같습니다.)

  2. enum 값을 보유 할 클래스를 만들었으므로. 열거 형의 이름을 보유 할 속성을 하나 더 추가합니다. 다시 NSComboBox에 대해 indexOfSelectedItem을 쿼리합니다. 이제 배열에 바인딩하는 데 사용하는 arrayController의 arrangedObjects에서 지정된 인덱스의 객체에 액세스하여 관련 값을 쉽게 얻을 수 있습니다. 콤보 박스. 후손에 대한 내 선택 솔루션 기록

+0

감사합니다. 나는 두 가지 해결책 모두 약간의 조정을 통해 OK 일을했을 것이라고 생각한다. –

0

:

결국, 나는 ...에 의해 열거를 사용하지 않는이 문제를 해결했다.

물론 콤보 상자는 객체 배열 (즉, NSObject 인스턴스)에 바인딩 될 것으로 예상되지만 열거 형은 정수 (정수)로 정의됩니다.

열거 형 값을 개체로 변환하고 다시 가져올 수있는 인프라를 제공 할 수 있다고 확신합니다. (표면 상, 이것은 NSValueTransformer 클래스가하는 것이고 하위 클래스와 디자인은 쉽습니다. 그러나 저에게있어서 NSValueTransformer 서브 클래스 나 인스턴스를 콤보에 바인딩하는 방법을 찾을 수 없었습니다. 그 필수 단계에 대한 문서는 존재하지 않습니다. 매우 미친 것입니다. 발견 한 모든 예제는 서브 클래스 화하는 방법에 대해서만 말했고 바인딩하는 방법에 대해서는 말하지 않았습니다. 그리고 제가 시도한 모든 것은 예외였습니다.)

결국, 열거 형 값을 클래스의 인스턴스로 만듦으로써이 모든 노력과 번역을 피할 수 있다는 것을 깨달았습니다.

그래서 열거와 함께, 당신은이 모든 작업을 수행 할 수 있습니다

typedef { a, b, c } EnumType; 
@interface SomeClass { 
    @property EnumType enumValue; 
}... 

// somewhere else, something like this: 
NSMutableArray *enumTypeNames = { @"a", @"b", @"c" }; 

을 ...콤보 상자를 enumTypeNames에 바인드하고 일부 곡예를 수행하여 enum 값을 enumTypeNames 인덱스로 변환하거나 그 반대로도 변환 할 수 있습니다.

@interface EnumClass { 
    @property NSString *name; 
} ... 
@interface SomeClass { 
    @property (weak) EnumClass *enumValue; 
} ... 

// somewhere else: 
NSMutableArray *enumValues = [NSMutableArray new]; 
[enumValues addObject: [EnumClass initWithName: @"a"]]; 
[enumValues addObject: [EnumClass initWithName: @"b"]]; 
[enumValues addObject: [EnumClass initWithName: @"c"]]; 

을 ... 그리고 (모델 키 경로로 지정 이름) 배열에 직접 콤보 상자를 바인딩 :

또는, 당신은이 작업을 수행 할 수 있습니다. 더 깔끔한 솔루션.

0

나는 이것을 NSValueTransformer을 사용하여 수행 할 수 있다고 생각합니다.

이처럼 열거를 정의하십시오 :
typedef NS_ENUM(NSUInteger, EnumType) { 
    foo = 0, 
    bar = 1, 
    baz = 2 
}; 

는 그런 다음 값 변압기에서, NSNumber로 입력을 처리하고 -unsignedIntegerValue를 호출합니다. 원하는 경우 열거 형으로 캐스팅하고 switch 문을 통해 실행 한 다음 적절한 문자열을 반환하십시오.

바인딩은 자동으로 열거 형 값을 NSNumber로 래핑해야합니다.

관련 문제