액션시트는 아이폰의 화면 아래에서 밀려 올라와 여러 선택 지 중 하나를 선택할 수 있는 옵션을 제공하는 기능이다. 물론 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버튼)은 별도의 상수로 그 인덱스가 정해져 있다. (각각 cancelButtonIndex
와 destructiveButtonIndex
로 프로퍼티로 구해짐)
그외의 델리게이트 메소드는 액션 시트가 표시되기 전, 후에 호출되는 메소드와 액션 시트를 취소했을 때 등의 동작에 대해 커스터마이징 할 수 있게 해준다. (처음 두 메소드는 액션시트가 화면에서 사라지기 전/ 후에 호출된다. 반면 위에서 소개한 actionSheet:clickedButtonAtIndex:
는 사용자가 버튼을 누르는 순간에 호출된다.
actionSheet:didDismissWithButtonIndex:
actionSheet:willDismissWithButtonIndex:
didPresentActionSheet:
willPresentActionSheet:
actionSheetCancel: