UIActionSheet로 버튼을 작업하면서 새로운 요구사항이 생겼다.

특정한 조건일 경우에만 버튼을 노출되어야 하는 요소들이 생겼다.

기존의 생성 방식은 아래와 같다

[[UIActionSheet alloc] initWithTitle:title
                                                  delegate:self
                                         cancelButtonTitle:NSLocalizedString(@"취 소", nil)
                                    destructiveButtonTitle:nil
                                         otherButtonTitles:NSLocalizedString(@"A", nil),
                                                           NSLocalizedString(@"B", nil),
                                                           NSLocalizedString(@"C", nil),
                                                           NSLocalizedString(@"D", nil),
                                                           NSLocalizedString(@"E", nil),
                                                           nil];

위와 같은 방법으로 하게 되면 타이틀이 추가된 순서대로 index번호가 부여된다

델리게이트를 통해 이벤트 결과를 받을 때도 이 index 번호로 버튼을 구분하게된다.

하지만 동적으로 버튼을 추가하게 될 경우 아래의 구문이 추가로 필요하게 된다.

[actionSheet addButtonWithTitle:NSLocalizedString(@"F", nil)];

즉 액션시트에 타이틀을 추가하는 메소드인데 이걸 사용하게 되면 인덱스 번호가 꼬이게 된다.

인덱스번호 

타이틀 

 0

 A

 1

 B

 2

 C

 3

 D

 4

 E

 5

 취소

 6

 F

즉 인덱스 번호로 타이틀을 구분하려고 할때 switch문 같은 분기문을 써야하는데 저렇게 취소 버튼이 중간에 있다보면 예외상황이 생기게 되고 나중에도 혼란을 야기한다.

이 문제를 해결하기 위해 아래와 같은 방법을 사용했다.

    NSMutableArray * names = [[NSMutableArray alloc]initWithCapacity:0];
   
    [names addObject:NSLocalizedString(@"A", nil)];
    [names addObject:NSLocalizedString(@"B", nil)];
    [names addObject:NSLocalizedString(@"C", nil)];
    [names addObject:NSLocalizedString(@"D", nil)];
    [names addObject:NSLocalizedString(@"E", nil)];

    if ( SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"5.0") == YES ) {
        [names addObject:NSLocalizedString(@"F", nil)];
    }
    [names addObject:NSLocalizedString(@"취 소", nil)];
    self.sendServiceNames = names;
    [names release];

    UIActionSheet * actionSheet = [[UIActionSheet alloc] initWithTitle:title
                                                              delegate:self
                                                     cancelButtonTitle:nil
                                                destructiveButtonTitle:nil
                                                     otherButtonTitles:nil];

    for(NSString * serviceName in self.sendServiceNames){
        [actionSheet addButtonWithTitle:serviceName];
    }
   
    actionSheet.cancelButtonIndex = [self.sendServiceNames count]-1;

즉 배열을 사용하여 액션시트에 들어갈 타이틀을 배열로 구성한 다음 반복문을 통해 addButtonWithTitle로 버튼을 입력한 다음 마지막에 cancelButtonIndex에 취소 버튼의 위치를 임의로 지정하게 되면 지정된 인덱스 번호를 취소 버튼의 위치로 출력하게 된다.

물론 델리게이트를 통해 인덱스 번호를 받을 때도 순차적인 인덱스를 얻을 수 있게 되었다.

 

'iOS' 카테고리의 다른 글

IOS 설정바로가기 URL  (0) 2012.04.19
UIDocumentInteractionController을 통한 앱간 문서 전달  (0) 2012.04.09
스레드 동작시 performSelector 주의점  (0) 2012.03.05
UITableViewCell 다루기  (0) 2012.02.06
TCP Dump  (0) 2011.12.29

+ Recent posts