티스토리 뷰

iOS

iOS 14 + ) UIAction closure based UIControl

Zedd0202 2020. 8. 16. 00:42
반응형

 

안녕하세요 :) Zedd입니다.

얼마전 트윗을 보다가 알게된 사실인데요.

이렇게 좋은 변경사항이 생기다니...!!!!하면서 좋아했어요 XD 

오늘은 iOS 14에서 새로나온 UIControl의 새로운 생성자를 공부해보겠습니다.

제 환경은 Xcode 12 beta 4입니다.

 

그 전에 먼저, 우리에게 가장 익숙한 UIButton을 보겠습니다.

코드로 UIButton을 만들고 해당 button을 탭할 때 마다 특정 action을 했으면 좋겠어요. 

보통 이렇게 하죠?

addTarget이 가장 익숙하실텐데요, iOS14에서는 다른 방법으로 button에 action을 줄 수 있게 되었습니다.

바로 이렇게 말이죠. addTarget을 사용한 코드와 완전히 똑같습니다. primaryAction이라는 파라미터가 눈에 띄는데요.

primaryAction은 UIAction타입을 받습니다.

UIAction은 iOS 13에서 새로나온 클래스인데요.

UIAction의 특징은 

이렇게 action에 closure를 바로 넣을 수 있습니다.

아무튼 iOS 14에서 이 UIAction을 사용하여 UIControl 인스턴스를 만들 수 있도록 새로운 생성자를 만들어줬습니다. 

바로 init(frame:primaryAction:)입니다. 

(UIButton의 생성자는 convenience init입니다. 궁극적으로 UIControl의 생성자를 호출하겠죠?)

 

이제 addTarget에서...벗어날 수 있ㄷ ㅏ...? #selector와..@objc에서 벗어날 수 있다...?????

 

 

앞서 사용한 

이게 너무 가독성이 떨어진다!!!!고 생각이 드시면

이렇게 2가지 방법으로 사용이 가능하니 참고하시길 바랍니다. 

 

한가지 더 볼게요.

제가 action을 이렇게 정의했는데요, 

UIAction의 생성자는

엄청 많은 파라미터를 받는 답니다. 하지만 handler를 제외하고 전부 기본값이 있기 때문에 넣어주지 않아도 되는거에요.

제가 버튼에 title을 달고싶어요.

이렇게 setTitle을 이용하는 방법도 있지만, UIAction의 생성자를 이용하면 간편합니다.

이렇게 말이죠. 

 

그럼 파라미터를 하나씩 보도록 하겠습니다.

 

title : 방금 봤듯이 이 action에 보여질 title입니다,

image: title옆에 표시할 이미지입니다.

만약 이렇게 했다?

이렇게 나옵니다. (UIButton만들 때의 타입을 system으로 준겁니다.)

identifier : action의 고유한 식별자라고 해요. 기본값은 nil인데, nil로 지정하면 알아서 고유한 식별자를 생성해준다고해요.

discoverabilityTitle : action의 목적을 설명하는 "정교한 제목(? elaborated title)"입니다. 

attributes : action의 style을 나타내는 속성입니다.

이렇게 3가지가 있습니다.

왼쪽처럼 그냥 넣을 수도 있고, 오른쪽 처럼 배열로 해서 넣어줄 수도 있습니다. 

근데 지정해줘도 왜 안먹지..?

 

state : action의 initial state입니다.

off, on, mixed이렇게 3가지를 넣을 수 있습니다.

handler : 사용자가 action을 선택한 후에 호출되는 핸들러입니다.

이 핸들러에는 action이라는 파라미터가 있는데 사용자가 선택한 action을 리턴합니다.

예를들어

내가 action에 설정한 여러가지 값들을 얻어올 수 있습니다.

 

Q : UIAction에 title이랑 image지정했는데 안나와!

A : 이 부분은 잘 이해가 안가는데..UIButton(type: , primaryAction:)이렇게 만들어줘야지만 UIAction에 있는 title이랑 image가 들어가더라구요;

만약 UIButton(type: , primaryAction:)을 사용하지 않고,

addAction을 사용해서 action을 넣어주면

(제가 frame 주고 addSubview한거에요) 나오기는 잘 나오는데..

그냥 action에 지정한 title과 image가 안나오더라구요.

이게 버그인지;; 스펙인지는 잘 모르겠습니다. 근데 왠지 스펙일듯;;;;

 

Q : 아까 위에서 identifier는 nil로 주면 알아서 유니크한 identifier를 넣어준다고 했는데...어케생김?

A : UIActionIdentifier(_rawValue: com.apple.action.dynamic.3DF491E5-EC96-4A73-B041-6D038B40D3D7)

이런식으로 나오네요? 

 

Q : Action주고 또 addTarget할 수 있어?

A : 네! 당연히 할 수 있습니다.

결과는 

Zedd

UIAction Handler

이 나옵니다. 

물론 addAction도 여러개 할 수 있습니다. 

 

그리고 오늘은 UIButton만 봤지만..

UIControl을 상속하는 어떤것이든 primaryAction이 있는 생성자로 생성 할 수 있는 점!! 참고해주세요. 

UIBarButtonItem같은게 있겠죠!?

 

⚠️ 제 Xcode가 beta여서 이러한 동작들이 정식버전과 다를 수 있습니다.

UIControl의 새로운 생성자와 UIAction을 집중하여 봐주세요. ⚠️

 

아무튼..!!! 재밌고 유용한 생성자가 나와서 좋네요 XD

벌써 일요일이라니.....뭐지..........ㅎㅎㅎ........지금 또 분위기가 안좋던데 다들 조심하세요! 😷

 

참고

www.avanderlee.com/swift/uibutton-uicontrol-closure-target/?utm_campaign=coschedule&utm_source=twitter&utm_medium=twannl&utm_content=Adding%20a%20closure%20as%20a%20target%20to%20UIButton%20and%20other%20controls%20in%20Swift

 

반응형

'iOS' 카테고리의 다른 글

iOS 14 + ) UILabel - lineBreakStrategy 실험👀  (2) 2020.08.18
iOS 14 + ) UIMenu on UIButton  (1) 2020.08.17
UISwitch 기록  (1) 2020.07.21
iOS 14 +) Date / Color Picker  (3) 2020.07.17
iOS 14+ ) PHPicker  (7) 2020.06.28