[swift/iOS] UITapGestureRecognizer에 전달될 함수에 파라미터 추가하기

2.so_j·2022년 8월 9일
post-thumbnail

UITapGestureRecognizer

UITapGestureRecognizerGesture Recognizer의 하위 클래스 중 하나로,

Recognizes tap gestures, including double-tap or multiple-tap

라고 합니다
한 번 터치 및 여러 번 터치를 인식해주는 클래스라고 생각하시면 됩니다

구현 상황

버튼이 아닌 view가 눌렸음을 인지해야 하는 상황이었고,
view는 커스텀 뷰로 재활용하고 있었기 때문에

몇 번째 뷰가 클릭 되었는지, 눌렸는지 아닌지의 여부를 알고싶었답니다

UITapGestureRecognizer 추가

첫 번째로 UITapGestureRecognizer를 추가해주는 일인데요

let hashtagView = HashtagView()   
let genreTapGesture = UITapGestureRecognizer(target: self, action: #selector(genreTapMethod))
            
hashtagView.addGestureRecognizer(genreTapGesture)

@objc func genreTapMethod(sender: GenreTapGestureRecognizer) {
    print(sender)
}

특정 view에 UITapGestureRecognizer를 생성해서 추가해주면 됩니다

action에 들어갈 함수는 tap되었을 때 실행할 함수이고
잘 되는지 확인해보기 위해서 print문을 찍어보았어요

하지만 제가 원하는 것은 현재 tap된 view의 정보들이었기 때문에
파라미터로 전달해주면 되겠다는 생각을 하게 되었습니다

action함수에 파라미터 전달하기

구글링의 결과로

let hashtagView = HashtagView()   
let genreTapGesture = UITapGestureRecognizer(target: self, action: #selector(genreTapMethod))

genreTapGesture.text = "안녕하세요"
hashtagView.addGestureRecognizer(genreTapGesture)

//genreTapMethod
@objc func genreTapMethod(sender: GenreTapGestureRecognizer) {
    print(sender.text)
}

이런식으로 변수를 사용하면 된다는 글을 보았으나
될리가 없습니다 ..

genreTapGesture에는 text가 없으니까 …

포인트는 UITapGestureRecognizer를 상속하는 custom class를 만들어주는 일

class GenreTapGestureRecognizer: UITapGestureRecognizer {
    var index: Int?
    var hashtagView: HashtagView?
    var isTouched: Bool? = false
    
    func setIsTouched() {
        self.isTouched?.toggle()
    }
}

이런식으로 class를 만들어주고

let genreTapGesture = GenreTapGestureRecognizer(target: self, action: #selector(genreTapMethod))
genreTapGesture.index = index
genreTapGesture.hashtagView = hashtagView

사용해주면 됩니다 !

@objc func genreTapMethod(sender: GenreTapGestureRecognizer) {
      print(sender.index)
}

하지만 collectionView를 사용하면 쉽게 구현 가능하다는 사실 !

Reference

https://sylii.tistory.com/8

profile
싱글코어 두뇌의 개발자 도전기

0개의 댓글