UIAlertController에는 크게 두가지 Alert 와 ActionSheet가 있다.
과거에는 UIAlertView, UIActionSheet 클래스가 구분되었으나 iOS 8.0 이후로 두 객체를 통합한 UIAlertController가 등장하였다.
Alert 와 ActionSheet 의 차이
Alert(알림창)
모달방식 : 알림창이 표시되는 동안 사용자가 터치할 수 있는 영역은 오직 알림창이다.
텍스트 필드를 추가할 수 있다.
ActionSheet
메세지가 떠 있는 동안에도 메시지 창이 아닌 다른 영역을 건드릴 있고 그결과로 액션시트 창이 닫힌다. (모달방식x)
텍스트 필드를 추가할 수 없다.
알림창이 표시되는 동안 코드는 계속 실행된다.
알림창이 화면에 표시되고 있는 동안 앱의 다른 기능을 사용할 수 없는 범위는 사용자의 터치 또는 드래그와 같은 이벤트로 제한된다.
애플리케이션이 자체적으로 실행하는 내용이 있다면 이는 알림창이 떠있더라도 계속실행한다.
=> UIAlertController는 비동기방식으로 실행되기 때문
AlertController 만들어보기
@IBAction func alert(_ sender: Any) {
// UIAlertController 인스턴스를 생성한다.
// preferredStyle : .alert / .actionSheet
let alert = UIAlertController(title: "선택", message: "항목을 선택해주세요", preferredStyle: .alert) //alert
let alert = UIAlertController(title: "선택", message: "항목을 선택해주세요", preferredStyle: .actionSheet) //actionsheet
// 버튼 액션 객체 생성
let cancel = UIAlertAction(title: "취소", style: .cancel){ (_) in
self.result.text = "취소 버튼을 클릭했습니다."
}
let ok = UIAlertAction(title: "확인", style: .default){ (_) in
self.result.text = "확인 버튼을 클릭했습니다."
}
let exec = UIAlertAction(title: "실행", style: .destructive){ (_) in
self.result.text = "실행 버튼을 클릭했습니다."
}
let stop = UIAlertAction(title: "중지", style: .default){ (_) in
self.result.text = "중지 버튼을 클릭했습니다."
}
// 버튼을 컨트롤러에 등록
alert.addAction(cancel)
alert.addAction(ok)
alert.addAction(exec)
alert.addAction(stop)
// 메세지 창 실행
self.present(alert, animated: false)
}
More about UIAlertController
✅ 어떤 순서로 등록하든지 간에 .cancel 로 설정된 객체는 항상 메세지 창의 맨 아래에 위치한다.
✅ 알람창과 액션시트 창 모두에서 .cancel 타입으로 설정된 버튼은 특별한 취급을 받기 때문에 하나의 창에 한번만 사용할 수 있다.
? 네트워크가 연결되지않은 경우 등 화면이 뜨자마자 메세지 창을 띄워야하는 경우
viewDidLoad() 메소드 내에서 메세지 창을 구현하면 런타임 오류 발생
이유 : 아직 메세지창을 처리해줄 뷰가 화면에 구현되지 않은 상태에서 화면전환을 시도했기 때문이다.
Solution : 뷰 객체가 메모리에만 올라온 상태에서 호출되는 viewDidLoad() 대신 뷰가 완전히 화면에 표시되고 난 후 호출되는 viewDidAppear(_:) 메소드를 이용하여야함
override func viewDidAppear(_ animated: Bool){
// 메시지 창을 처리하기 적절한 위치
let alert = UIAlertController (..)
}
Alert메세지창 with textfield
present 호출 위에 textfield 추가
configurationHandler: 추가된 텍스트 필드의 속성을 설정하기 위한 클로저
tf : 텍스트 필드 객체 정보가 클로저의 인자값으로 전달되는데 이를 tf 로 할당 받음
configurationHandler 를 사용하지 않는 경우 : alert.addTextField()
메세지 창에 추가된 텍스트 필드는 textFields 속성을 통해 참고할수 있으며, 메세지 창에 추가할 수 있는 텍스트 필드는 여러개 이기 때문에 배열을 통해서 접근한다.
alert.textFields?[0] or alert.textFields?.first
@IBAction func login(_ sender: Any) {
let title = "카카오톡에 로그인"
let message = "사용자의 kakao ID chaneeii@chaneeii.com 의 암호를 입력하세요"
let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
let cancel = UIAlertAction(title: "취소", style: .cancel)
let ok = UIAlertAction(title: "확인", style: .default) { (_) in
// when ok button is clicked
if let tf = alert.textFields?[0] { // or alert.textFields?.first
print("입력받은 값 : \(tf.text)")
}else{
print("입력받은 값이 없습니다.")
}
}
alert.addAction(cancel)
alert.addAction(ok)
// ✅present 호출 위에 textfield 추가
alert.addTextField(configurationHandler: { (tf) in
tf.placeholder = "암호"
tf.isSecureTextEntry = true //비밀번호이니깐!
})
self.present(alert, animated: false)
}
UIAlertController
UIAlertController에는 크게 두가지 Alert 와 ActionSheet가 있다. 과거에는 UIAlertView, UIActionSheet 클래스가 구분되었으나 iOS 8.0 이후로 두 객체를 통합한 UIAlertController가 등장하였다.
Alert 와 ActionSheet 의 차이
Alert(알림창)
ActionSheet
AlertController 만들어보기
More about UIAlertController
Alert메세지창 with textfield
alert.addTextField()
alert.textFields?[0]
oralert.textFields?.first
References