본문 바로가기

개발/App Developer

탭바와 피커


* 델리게이트와 데이터 소스

- 피커는 여러 가지 작업을 델리게이트에게 위임한다.

  그 중에서도 가장 중요한 것은 각 행과 해당 행에 속한 컴포넌트 중에서 실제로 무엇을 그릴지를 결정하는 일이다.

  피커는 델리게이트에게 문자열 또는 주어진 컴포넌트의 특정 위치에 내용을 그리기 위한 뷰를 요청한다.

 

- 데이터 소스는 피커에게 몇 개의 컴포넌트와 몇 개의 목록이 각각의 컴포넌트를 구성하고 있는지 알려준다.

  데이터소스는 델리게이트와 유사한 방식으로 동작하지만, 매서드가 미리 정해진 시간에 호출된다는 점이 다르다.

 

* 탭바 아이콘

- 아이콘은 24 * 24 픽셀 크기여야 하고, PNG 포멧으로 저장되어야 한다.

  또 아이콘 파일은 투명 배경을 가지고 있어야 한다.

  일반적으로 중간 크기의 회색 아이콘이 탭바에서 가장 잘어울린다.

 

* Tab Bar Controller

- Tab Bar Item Attributes

    Tab Bar Item

      Badge : 이 옵션은 메일 애플리케이션에서 읽지 않은 메일이 몇 개인지를 나타낼 때 아이콘 위에 빨간색 숫자를

                  보여주는 것처럼 탭자에 빨간색 아이콘을 보여주기 위해 사용된다.

      Identifier : 이것은 Favorites 와 Search 와 같은 일반적인 아이콘을 탭바에서 사용할 수 있도록 만들어 준다.

 

- Bar Item

    Title : 제목

    Image : 사용할 이미지 파일

 

* 작업순서

1. 탭을 클릭하고 속성 인스팩터를 사용하여 뷰 컨트롤러와 연결시킨 탭의 nib 파일 이름을 입력

2. 아이텐터티 인스펙터를 열고 탭과 연결된 뷰 컨트롤러의 하위 클래스를 변경

3. 탭바 아이템을 수정하기 위해 뷰 컨트롤러 대신에 탭을 한번 더 클릭하고 탭바 아이템의 텍스트와 아이콘을 설정

 

* Picker View

- 날짜 피커와는 조금 다른 점은 일반적인 피커는 자신이 어떤 데이터를 가지고 있는지를 알려주지 않는다.

  데이터를 직접 보관하지 않기 때문이다.

  대신 델리게이트와 데이터소스가 그 역할을 담당한다.

  우리는 대신에 직접 피커에게 어떤 행이 선택되었는지 물어보고, PickerData 배열에 대응하는 데이터를 선택해야 한다.

- viewDidLoad 에서 우리는 피커에 데이터를 공급할 수 있도록, 여러 객체를 담을 수 있는 배열을 생성했다.

  일반적으로 데이터는 프로젝트 폴더의 Resources 폴더에 있는 프로퍼티 리스트 파일과 같은 소스들로부터 전달된다.

 

피커 구현에 필요한 새로운 매서드

* UIPickerViewDataSource 에서 나온 공통으로 필요한 메서드

 

- (NSInteger) numberOfComponentsInPickerView:(UIPickerView*)pickerView{

return 1;

}

  피커는 하나 이상의 회전판 또는 컴포넌트를 가질 수 있기 때문에, 이 방법을 사용해서 피커가 얼마나 많은 컴포넌트를 표시해야

  할지를 물어볼 수 있다. UI 피커가 매개변수로 전달되었다는 데 주목하자.

  이 매개변수는 우리가 요청을 하는 피커 뷰를 가리키는 매개변수로서, 이를 통해 동일한

  데이터 소스가 여러 개의 피커를 관리할 수 있게 된다.

 

- (NSInteger)pickerView:(UIPickerView*)pickerView numberOfRowsInComponent(NSInteger)component{

  return [pickerData count];

}

  피커에게 해당 컴포넌트에 몇 개의 행이 있는 지 물어보는 매서드

 

* UIPickerViewDelegate 에서 나온 공통으로 필요한 메서드

 

- (NSString*)pickerView:(UIPickerView*)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{

  return [pickerData objectAtIndex:row];

}

  이 메서드에서 피커는 특정 컴포넌트에서 특정 행에 대한 자료를 제공하도록 요청한다.

  우리는 요청받은 컴포넌트와 행의 정보와 함께 피커에 대한 포인터를 제공하면 된다.

 

* 2개 이상의 회전판 피커 구현시 델리게이트와 데이터 소스 예제

 

// 몇개의 회전판을 구성할 것인가?

-(NSInteger)numberOfComponentsInPickerView:(UIPickerView*)pickerView

{

    return 2 ; // 2개의 회전판을 구성

}

 

//어떤 회전판에 어떤 데이터소스를 사용할 것인가? (몇개의 데이터 행이 존재하는 가?)

-(NSInteger)pickerView:(UIPickerView*)pickerView numberOfRowsInComponent:(NSInteger)component

{

   if(component ==0)

      return [self.breadTypes count];

  else

      return [self.fillingTypes count];

}

 

//선택된 회전판에서 데이터 알아내기

-(NSString *)pickerView:(UIPickerView*)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component

{

  if(component ==0)

      return [self.breadTypes objectAtIndex:row];

  else

      return [self.fillingTypes objectAtIndex:row];

}

 

 

* 번들(Bundle) 이란?

- 특별한 구조를 따르는 컨텐츠를 가진 좀 특별한 폴더의 일종

  애플리케이션과 프레임워크도 모두 번들이고, 이들을 호출하면 우리의 애플리케이션을 나타내는 번들 객체를 리턴하게 된다.

  NSBundle의 주된 용도는 프로젝트에 추가한 Resoures 폴더에서 리소스를 획득하는 것이다.

  애플리케이션을 빌드할 때 이 파일들이 여러분의 애플리케이션의 번들로 복사된다.

 

* Dictionary 로 file 에서 데이터 가져오기

-(void)viewDidLoad

{

  NSBundle *bundle = [NSBundle mainBundle]; // 애플리케이션의 메인 번들에서 참조를 획득

  NSString *plistPath = [bundle pathForResource:@"statedictionary" OfType:@"plist"];

  NSDictionary *dictionary = [[NSDictionary alloc] initWithContensOfFile:plistPath];

  self.stateZips = dictionary;

  [dictionary release];

 

  NSArray *components = [self.stateZips allKeys];

  NSArray *sorted = [components sortedArrayUsingSelector:@selector(compare:)];

  self.states = sorted;

 

  NSString *selectState = [self.states objectAtIndex:0];

  NSArray *array = [stateZips objectForKey:selectedState];

  self.zips = array;

}

 

 

* 피커의 선택이 변경될 때마다 매서드가 계속 호출된다.

-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
  if(component == kStateComponent)
  {
    NSString *selectedState = [self.states objectAtIndex:row];
    NSArray *array = [statZips objectForKey:selectedState];
    self.zips = array;
    [picker selectRow:0 inComponent:kStateComponent animated:YES];
    [picker reloadComponent:kZipComponent];
  }
}

 

'개발 > App Developer' 카테고리의 다른 글

자동회전과 자동크기 조절  (0) 2010.08.30
멀티뷰 애플리케이션  (0) 2010.08.30
테이블 뷰 입문  (0) 2010.08.30
리눅스 쬐금  (0) 2010.08.30
tableView 의 클래스와 프로토콜 이해  (0) 2010.08.29