ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • #selector 에 parameter 전달하기
    iOS 2020. 6. 4. 15:01
    728x90

    addTarget, UIGestureRecognizer 등을 사용할 때 action을 주기 위해 #selector를 사용합니다.

    하지만 #selector를 사용할 때는 임의로 파라미터를 전달할 수가 없고

    오직 sender 로 버튼이나 제스쳐 같은 대상만을 파라미터로 받을 수가 있습니다.

    오늘 알아볼 방법은 원하는 파라미터를 전달할 수 없으니 대신 파라미터가 되는 대상을 원하는 아이로 바꾸는 방법입니다.

    바로 예시를 살펴보겠습니다.

    \

    swipe를 할 때 원하는 정보를 함께 전달하고 싶어요

    \

    보통 일반적인 스와이프 제스쳐는 이렇게 생성합니다.

    override func viewDidLoad() {
      super.viewDidLoad()
    
      let swipeGesture = UISwipeGestureRecognizer(target: self, action: #selector(self.swipeAction(gesture:)))
      swipeGesture.direction = .up
      myTaget.addGestureRecognizer(swipeGesture)
    }
    
    @objc swipeAction(gesture: UISwipeGestureRecognizer) {
      // action
    }

    이때 특정 정보를 함께 전달하고 이 상태로는 전달할 수가 없습니다 ㅠㅠ

    그래서 저희는 UISwipeGestureRecognizer를 제가 원하는 변수를 가진 녀석으로 커스텀 해보려고 해요

    만약 어떤 text를 전달하고 싶다면 제가 만든 swipeGesture가 text 정보를 담고 있는 형태로 말이죠

    override func viewDidLoad() {
      super.viewDidLoad()
    
      // UISwipeGestureRecognizer -> CustomSwipeGesture로 변경
      let swipeGesture = CustomSwipeGesture(target: self, action: #selector(self.swipeAction(gesture:)))
      swipeGesture.text = "원하는 정보"
      swipeGesture.direction = .up
      myTaget.addGestureRecognizer(swipeGesture)
    }
    
    @objc swipeAction(gesture: CustomSwipeGesture) {
      print(gesture.text) // "원하는 정보"
    }
    
    class CustomSwipeGesture: UISwipeGestureRecognizer {
      var text: String?
    }

    이런식으로 말이죠! 상황에 따라 더 좋은 방법이 있을 수 있겠지만 이런 방법도 있구나 하고 알아가시면 좋을 것 같습니다 :)

    조금이라도 도움이 되셨으면 좋겠습니다. 감사합니다!

    댓글

Designed by Tistory.