본문 바로가기
iOS

[iOS] UIAlertController, UIAlertAction

by SiO2whocode 2021. 1. 30.
728x90

이런 알림창을 띄우고 처리해야 할 때 사용하는 객체가 UIAlertControllerUIAlertAction

 

let alert = UIAlertController(title: "안내", message: "계속하시겠습니까?", preferredStyle: .alert)
let actionYes = UIAlertAction(title: "예", style: .default, handler: nil)
let actionNo = UIAlertAction(title: "아니오", style: .cancle, handler: nil)
alert.addAction(action)
alert.addAction(action2)
present(alert, animated: true, completion: nil)

 

우선 저 위의 이미지 처럼 팝업을 띄우는 코드는 위와 같다.

alert는 AlertControllertitlemessage, preferredStyle(팝업 스타일)을 설정하여 초기화한다.

preferredStyle에는 .alert와 .alertsheet 이 있는데

.alert는 위와 같이 팝업을 화면정중앙에 띄우고

.alertsheet는 화면 하단에 팝업을 띄운다.

 

alert에서 어떠한 액션을 수행해야 한다면 (예, 아니오 등의 이벤트를 처리해야 한다면)

UIAlertAction 객체를 연결해줘야한다.

위와 같이 예, 아니오 두가지 경우가 있다면 UIAlertAction 객체를 각각 생성한다.

 

UIAlertAction은 title, style, handler를 전달하여 초기화한다.

style은 .default, .cancel, .destructive가 있다.

여기서 살펴본 부분은 액션이 두개 이상일 때

둘다 .default로 설정하면 addAction을 수행한 순서대로 표현된다.

하나는 .default, 다른 하나는 .cancel로 설정하면

addAction 순서에 상관없이 .cancel인 액션이 밑으로 가거나, 왼쪽으로 간다.

.destructive는 텍스트 색깔이 red로 표현된다.

내부 동작이 어떻게 다른지는 아직 잘 모르겠다.

 

우선 handler는 nil로 넣어뒀다. (터치 시 아무일도 일어나지 않음)

이렇게 UIAlertAction 객체생성을 완료했으면

UIAlertControlleraddAction메서드를 사용하여 연결해주면 된다.

 

이후 화면에 띄우려면 present를 해줘야한다. (안스에서 끝에 .show()를 해주는 것과 같다)

위의 코드는 UIButton와 연결된 Action메소드 안에 작성되었다.

 

위에서는 UIAlertAction의 handler에 nil값을 전달하여 터치시 아무일도 일어나지 않았다.

이제 handler에 메서드를 전달하여 터치시 어떤 일이 일어나게 해보겠다. 

 

UIAlertAction의 handler는 위와 같은 형식의 메서드를 인자로 받는다.

자동으로 UIAlertAction이 매개변수로 넘어가고, 반환타입이 없는 메서드면 된다.

예를 들어 아래와 같은 메서드

 

func alertHandler(_ action: UIAlertAction){
      if action.style == .default {
      	print("'예'가 선택됨")
      } else if action.style == .cancel {
     	print("'아니오'가 선택됨")
      }
}

 

handler에 대한 설명인데 대충 이 액션이 선택됐을때 실행되는 코드블럭이다(메서드든 클로저든)

뒷말은 메서드 형식에 대한 설명 (위에서 말한 것)

 

위와 같은 메서드를 정의한 후에 아래 코드 처럼

액션의 handler에 해당 메서드를 전달해주면 된다.

 

let action = UIAlertAction(title: "예", style: .default, handler: alertHandler(_:))
let action2 = UIAlertAction(title: "아니오", style: .cancel, handler: alertHandler(_:))

 

두 액션이 모두 같은 핸들러에 연결되면 핸들러 안에서 액션이 무엇인지 구분하여 처리해주면 된다.

위의 핸들러 코드에서 처럼 액션의 스타일로 구분해도 되고 (아마 용도가 이게 아닐지)

title로도 구분이 된다.

 

 

그럼 팝업창에서 예, 아니오 클릭시 콘솔창에 다음과 같이 출력된다.

728x90

'iOS' 카테고리의 다른 글

[iOS] swift tab bar 사용시 presentingViewController  (0) 2021.03.08
[iOS] 아이패드에서 UIAlertController actionSheet사용시 오류  (0) 2021.03.04
[iOS] Core Data  (0) 2021.02.13
[iOS] CollectionView  (0) 2021.02.12
[iOS] tableView  (0) 2021.02.05