UI Button + Action

pcsoyeon·2021년 10월 22일
0

코드로 UIButton을 만들고 해당 버튼을 탭 할 때마다 어떠한 동작을 하도록 구현하고 싶다면? addTarget을 하기도 하고 UIAction으로 액션 값을 줄 수도 있다.

이 두가지 함수의 차이가 무엇일까?
버튼에 액션을 추가하는 것은 iOS14에서 새롭게 나온 속성으로 action에 바로 클로저를 넣을 수 있다는 것이 특징이다.

UIAction

UIAction을 활용하면
init(frame:primaryAction:)를 통해 UIControl의 새로운 인스턴스를 생성할 수 있다.

UIAction의 생성자를 보면

기본적으로 받는 파라미터가 많다. 그러나 handler를 제외하고 기본값이 설정되어 있기 때문에 넣어주지 않아도 된다.

그치만 생성자의 파라미터를 통해서 보다 간결하게 버튼을 구성할 수 있다.
예를 들어 버튼의 타이틀을 설정하는 경우,

let action = UIAction { _ in print("action!!") } 
let button = UIButton(type: .custom, primaryAction: action) 
button.setTitle("hello", for: .normal)

이런 식으로 setTitle을 사용할 수도 있지만, 생성자를 통해서

let action = UIAction(title: "안녕하세요", handler: { _ in print("Zedd") })
let button = UIButton(type: .custom, primaryAction: action)

바로 타이틀을 설정할 수 있다.

Parameters

UIAction의 파라미터를 살펴보자.

  • title : 해당 액션이 적용될 것의 title을 설정
  • image : title 옆에 보여질 image
  • identifier : action의 고유한 식별자, 기본값은 nil, nil로 지정하면 알아서 고유한 식별자를 생성
  • discoverabilityTitle : action의 목적을 설명하는 정교한 제목 (= elaborated title)
  • attributes : action의 style을 나타내는 속성
    - disabled
    • destructive
    • hidden
      이렇게 세가지 속성이 있다.
  • state : action의 initial state
    - off
    • on
    • mixed
      이렇게 세가지 속성이 있다.
  • handler : 사용자가 action을 선택한 후에 호출되는 핸들러

etc

UIAction에 title과 image를 지정했는데 보이지 않는다?

예를 들어

let action = UIAction(title: "안녕하세요", 
	image: UIImage(systemName: "heart.fill"),
	handler: { action in print("UIAction Handler") })

이런 식으로 action을 설정하고 이를 버튼에 적용할 때
UIButton(type: , primaryAction:)을 사용하지 않고, addAction을 사용해서 action을 넣어주면 action에 지정한 title과 image가 보이지 않는다.

버튼에 action, target 모두 적용할 수 있는가?

YES
하나의 버튼에 대해서 action도 target도 복수개로 적용할 수 있고 모두 작동한다.

profile
Slowly But Surely

0개의 댓글