UIActionSheet

액션시트는 아이폰의 화면 아래에서 밀려 올라와 여러 선택 지 중 하나를 선택할 수 있는 옵션을 제공하는 기능이다. 물론 iOS는 UIAlertView도 제공하고 있는데, 액션 시트는 보다 넓은 공간을 사용할 수 있고 선택지를 많이 넣을 수 도 있다. UIAlertView는 웹에서의 alert,confirm,prompt등의 기능에 대응되는 개념이고, 액션 시트는 보다 커스터마이징한 개념이라고 봐도 되겠다. 주로 “삭제하기”등 되돌릴 수 없는 액션에 대해 최종 확인을 위한 UI로 많이 쓰이고, 그외에 특정 액션을 수행할 때 선택지를 제공하는 경우에 쓰인다.

동작 방식

액션 시트의 동작 방식은 간단하다. 액션 시트는 코드 상에서만 생성할 수 있고, 호출 시 델리게이트를 지정해준다. 델리게이트는 특정한 버튼이 눌러지거나 액션이 취소되었을 때 상황에 따른 메시지를 받게 되고, 그에 맞는 동작을 하면 된다.

시트 생성

다음은 시트를 생성하는 메소드

    - (id)initWithTitle:(NSString *)title delegate:(id <UIActionSheetDelegate>)delegate cancelButtonTitle:(NSString *)cancelButtonTitle destructiveButtonTitle:(NSString *)destructiveButtonTitle otherButtonTitles:(NSString *)otherbuttonTitle1, .... ;

시트 표시하기

시트를 표시하는 방법은 사실 여러가지가 있다. 아이폰에서는 그게 그거이고… 아이패드에서는 특정한 버튼이나 뷰로부터 popover처럼 표시되는 게 표준 가이드라인이기 때문에 그러한 듯 하다. 각 메소드의 자세한 설명은 개발자 문서를 참고

  • showFromBarButtonItem:animated:
  • showFromRect:inView:animated:
  • showFromTabBar:
  • showInView:

델리게이트

델리게이트는 UIActionSheetDelegate 프로토콜을 따라야 한다. 통상 사용자가 특정 버튼을 누르면 actionSheet:clickedButtonAtIndex:가 호출되는데, 표준 버튼의 인덱스 (취소 및 destructive버튼)은 별도의 상수로 그 인덱스가 정해져 있다. (각각 cancelButtonIndexdestructiveButtonIndex로 프로퍼티로 구해짐)

그외의 델리게이트 메소드는 액션 시트가 표시되기 전, 후에 호출되는 메소드와 액션 시트를 취소했을 때 등의 동작에 대해 커스터마이징 할 수 있게 해준다. (처음 두 메소드는 액션시트가 화면에서 사라지기 전/ 후에 호출된다. 반면 위에서 소개한 actionSheet:clickedButtonAtIndex:는 사용자가 버튼을 누르는 순간에 호출된다.

  • actionSheet:didDismissWithButtonIndex:
  • actionSheet:willDismissWithButtonIndex:
  • didPresentActionSheet:
  • willPresentActionSheet:
  • actionSheetCancel:

예제