Combo Boxes
OSXDEV
목차 |
[편집] How ComboBoxes Work
[편집] Providing Data for a Combo Box
NSComboBox 컨트롤은 내부 아이템 리스트 혹은 당신이 제공하는 오브젝트로부터 데이타 소스라고 불리는 팝업 리스트를 얻기 위해 설정될 수 있다. setUsesDataSource:와 함께 사용하기 위해. 디폴트로, 컴보박스는 인터널 리스트를 사용한다.
컴보박스가 외부 데이타 소스를 사용한다고 지정하고 내부 리스트를 사용하는 메소드- addItemWithObjectValue:같은 - 를 발생시키려 한다면 메소드는 예외상황을 발생시킬 것이다.
[편집] Working With an External Data Source
외부 데이타 소스는 컴보박스가 그 데이타로 엑세스하기위한 메소드를 선언한다. 내부 리스트가 당신의 데이타에 충분하지 않을 경우에 사용한다. 외부 데이타 소스는 어떤 방법으로든 그 아이템을 담을 수 있지만, 정수 인덱스를 통해 구분할 수 있어야 한다. 컴보박스가 외부 데이타 소스를 사용한다는 것을 지정하기 위해서는, 먼저 setUsesDataSource:에 YES값을 매개변수로 사용하고, setDataSource:에 당신의 데이타 소스 오브젝트를 매개변수로 사용한다. setUsesDataSource:이전에 setDataSource:를 사용한다면, setDataSource:는 예외상황을 발생시킨다. 데이타 소스는 다음의 메소드들을 정의해야 한다. setDataSource: 메소드는 그 매개변수가 이것들을 수행하지 않으면 경고를 로그한다. - numberOfItemsInComboBox: 는 디스플레이할 아이템이 얼마나 되는지를 리턴한다. - comboBox:objectValueForItemAtIndex: 지정된 인덱스에 해당하는 오브젝트를 리턴
데이타 소스는 다음 메소드들을 옵션으로 정의할 수 있다. setDataSource는 이들을 체크하지 않으며 컴보박스는 이들이 가능한 상태일 때만 발생시킨다. - comboBox:indexOfItemWithStringValue:는 지정된 스트링과 일치하는 아이템의 인덱스를 리턴한다. 이 메소드가 사용가능하다면, 컴보박스는 사용자가 텍스트 필드에 타입을 할 때 팝업 리스트가 표시된 채로 incremental 검색을 한다. - comboBox:completedString:는 지정된 스트링으로 시작하는 스트링을 리턴한다. 만약 자동채우기가 가능한 상태라면, 컴보박스는 사용자가 팝업 리스트에 있는 아이템으로 텍스트 필드에 타이핑을 할 때 그것을 완성시키려 할 것이다. 이 메소드가 사용불가이며 자동채우기가 가능한 상태라면, 컴보박스는 완성본을 위해 아이템을 하나하나 검사해 나갈 것이다.
그리고 여기 당신의 데이타 소스가 그 데이타를 백그라운드에서 로드하고자 할 때 필요로 할 몇개의 NSComboBox 메소드들이 있다. - noteNumberOfItemsChanged는 컴보박스로 변경된 데이타 소스 아이템의 갯수를 통지한다. - reloadData는 컴보박스에 재디스플레이가 필요한지를 마크하여 보이는 팝업 아이템의 데이타를 리로드하고 새 값들을 그린다.
컴보박스는 그 데이타 소스로 제공된 오브젝트를 컴보박스의 팝업 리스트에서 디스플레이 하기 위한 값으로 처리한다. 오브젝트들이 일반적인 값의 클래스- 스트링, 넘버등-가 아니면 그것을 디스플레이 하기 위해 커스텀 NSFormatter를 만들어야 할 것이다. 좀 더 자세한 정보를 위해 Data Formatting을 보라.
[편집] Working With an Internal List
NSComboBox는 데이타 소스를 사용하지 않는 컴보박스를 위해 내부 아이템 리스트에 아이템을 더하고 삽입하고 삭제할 수 있는 완전한 메소드 세트를 제공한다. - 리스트의 마지막에 하나 혹은 그 이상의 아이템을 더하기 위해 addItemWithObjectValue:또는 addItemsWithObjectValues:를 사용. - 리스트의 중간에 아이템을 넣기 위해서는, insertItemWithObjectValue:atIndex:를 사용 - 특정 오브젝트를 위한 인텍스를 찾기 위해서는 indexOfItemWithObjectValue:를 사용 - 특정 인텍스에 있는 오브젝트를 찾기 위해서는 itemObjectValueAtIndex:를 사용 - 리스트에서 아이템을 삭제하기 위해서는 removeAllItems, removeItemAtIndex:혹은 removeItemWithObjectValue:를 사용 - 리스트의 아이템 전체에 대한 어레이를 불러오기 위해서는, objectValues를 사용. - 리스트안의 아이템 갯수를 불러오기 위해서는, numberOfItems를 사용.
usesDataSource가 YES를 리턴하는 상황에서 위의 메소드들 중 하나를 사용하면, 그 메소드는 예외상황을 만들 것이다. 디폴트로, useDataSource는 NO를 리턴한다.
[편집] Managing the Combo Box's List
컴보박스의 리스트 모양에 영향을 주는 방법은 프로그램으로 그것을 컨트롤 하는 것 과 함께 여러가지가 있다
[편집] Setting the List's Appearance
다음 메소드들은 리스트의 모양을 컨트롤 할 수 있게 해준다.
- setHasVerticalScroller:를 사용하여 팝업 리스트가 수직 스크롤바를 가질지를 선택한다. 스크롤바가 없으면, 리스트의 처음이나 끝에서 마우스 버튼을 누르고 있는 것으로 보이지 않는 부분으로 스크롤 할 수 있다. 스크롤 바가 있으면, 리스트의 보이는 부분안에 모든 아이템들이 보여질 수 있더라도 스크롤 바는 보인다. - 팝업 리스트에 표시되는 아이템의 갯수를 설정하기 위해서, setNumberOfVisibleItems:를 사용한다. 디폴트 값은 5이다. - 리스트안의 각각의 아이템을 포함하는 공간을 설정하기 위해서는 setIntercellSpacing:에 NSSize타입의 매개변수를 사용한다. 너비 컴포넌트는 리스트의 좌, 우 마진을 포인트로 나타낸 크기이다. 높이 컴포넌트는 위, 아래 아이템 공간을 포인트로 나타낸 것이다. - 각 리스트 아이템의 높이를 설정하기 위해서는 setItemHeight:를 사용.
[편집] Manipulating the List's Selection
다음 메소드들은 리스트의 선택을 수정할 수 있게 한다.
- 특정한 아이템을 선택하도록 할 때는 selectItemAtIndex:혹은 selectItemWithObjectValue:를 사용 - 선택된 아이템을 불러오기 위해서는 indexOfSelectedItem 혹은 objectValueOfSelectedItem을 사용 - 아이템 선택을 없애기 위해서는 deselectItemAtIndex:
리스트의 선택을 변경하는 것은 컴보박스 텍스트 필드의 컨텐츠에 변화를 주진 않는다. 자세한 정보는 "Setting the Combo Box's Value" 장을 참조하라.
[편집] Scrolling the List
다음 메소드들은 리스트를 스크롤 할 수 있게 한다. 이 메소드들을 사용하기 위해서 리스트가 보여야 할 필요는 없다.
- 리스트를 스크롤 하여 특정 아이템이 맨 위에 가장 가깝게 오도록 하여면 scrollItemAtIndexToTop을 사용. - 특정 아이템이 보이도록 리스트를 스크롤하고 싶다면 scrollItemAtIndexToVisible을 사용.
[편집] Setting the Combo Box's Value
표준 NSControl 메소드들을 사용해서 컴보박스의 값을 설정하거나 불러오려 한다면(setStringValue:, stringValue, setFloatValue: 그리고 floatValue), 리스트의 현재 선택이 아닌 컴보박스의 텍스트 필드 값을 설정하거나 불러오는 것이다. 프로그램적으로 컴보박스의 값을 변경하는 것은 컴보박스 리스트의 선택을 변경하는 것이 아니다. 그 반대로, 리스트의 선택을 프로그램적으로 변경하는 것은 텍스트 필드의 값을 바꾸지 않는다. 텍스트 필드의 값과 리스트 선택을 맞추길 원한다면, 개별적으로 설정할 필요가 있다. 예를 들어, 컴보박스의 리스트를 초기화한 후 텍스트 필드는 리스트의 세번째 아이템으로 하고 싶다고 치자. 이 Obj-C 코드조각이 내부 아이템 리스트를 가지는 컴보박스에 그 일을 한다.
[myComboBox selectItemAtIndex:2]; // First item is at index 0 [myComboBox setObjectValue:[myComboBox objectValueOfSelectedItem]];
동일한 자바 코드조각이다.
myComboBox.selectItemAtIndex(2);// First item is at index 0 myComboBox.setObjectValue(myComboBox.objectValueOfSelectedItem());
외부 데이타 소스를 가지는 컴보박스를 위한 동일한 코드조각이다
[myComboBox selectItemAtIndex:2];
[myComboBox setObjectValue:
[myComboBoxDataSource comboBox:myComboBox
ObjectValueForItemAtIndex:[myComboBox indexofSelectedItem]]];
같은 일을 하는 자바 코드
myComboBox.selectItemAtIndex(2);
myComboBox.setObjectValue(
myComboBoxDataSource.comboBoxObjectValueForItemAtIndex(
myComboBox, myComboBox.indexofSelectedItem()));
그리고 컴보박스의 텍스트 필드를 "Red"로 초기화하고 리스트에 있다면 그것을 선택하는 코드조각. 이 코드조각은 내부 혹은 외부 데이타 소스 든 상관없이 컴보박스에 동작한다.
[myComboBox setStringValue:@"Red"]; [myComboBox selectItemWithObjectValue:@"Red"];
같은 일을 하는 자바 코드조각
myComboBox.setStringValue("Red");
myComboBox.selectItemWithObjectValue("Red");
[편집] Using Automatic Completion in Combo Boxes
컴보박스는 사용자가 텍스트 필드에 타입할 때 팝업 리스트의 내용으로 그 내용을 완성시키려 시도하는 자동 채우기를 수행 할 수 있다. 그렇게 하려면, 사용자가 텍스트 필드의 끝에 문자를 넣을 때마다, 컴보박스는 NSComboBoxCell의 메소드인 completeString:을 호출해야 한다. completedString:이 현재 존재하는 스트링보다 긴 스트링을 리턴하면, 컴보박스는 현존하는 스트링을 리턴된 스트링으로 대치하고 더해진 문자들을 선택한다. 사용자가 스트링의 바깥쪽이나 지운 문자들에 문자를 더하면, 컴보박스는 이것을 완성시키려 하지 않는다. completedString:의 디폴트 수행은 첫번째로 컴보박스가 데이타 소스를 사용하는지 여부이며 데이타 소스가 comboBox:completedString:혹은 comboBoxCell:completedString:에 응답하는지를 점검하는 것이다. 응답한다면, 컴보박스 셀이 그 메소드의 리턴 값을 리턴한다. 아니라면, 이 메소드는 컴보박스의 아이템을 하나하나 점검하고 사용자가 타입한 스트링으로 시작하는 첫번째 아이템을 리턴한다. 이 비교는 대소문자 구분 않는다. 컴보박스가 자동채우기를 하는지를 읽거나 설정하려면, completes와 setCompletes:를 사용한다. 디폴트로는 자동채우기를 하지 않는다.
| 번역자 | 사용자:LingoStar |
| 원본문서링크 | http://developer.apple.com/documentation/Cocoa/Conceptual/ComboBox/ComboBox.html#//apple_ref/doc/uid/10000020 (Last Updated - 2002-11-12) |




