본문 바로가기

Swift

touchesBegan in UICollectionView

아.. 몇 시간 동안 삽질해서 알아낸 것이 아래 내용이다.



UICollectionView에서의 기능

  • touchesBegan : 원래 목적은 TextField를 제외한 화면 아무데나 터치하면 키보드를 dismiss하려고 넣은 메소드이나 UICollectionView에서는 아무리 해도 이 메소드가 호출되지 않는 것을 알게 됨. 대안은 아래 주석과 소스로 설명 대체

    // 텍스트필드말고 다른 곳 터치하면 키보드를 가리도록 한다.
    // 고대로부터 전해져 내려오는 얘기로는 UITableView, UICollectionView는 이 메소드가 먹지 않는다고 한다.
    // 물론 toucheBegan을 Cell에 장착하면 이벤트가 발생한다. 하지만 Cell과 Cell사이를 탭하거나 Section Header를 탭할 때는 역시 이벤트가 발생하지 않는다.
    // http://stackoverflow.com/a/5382784/6291225
    // 뭐 하려면 UITableView나 UICollectionView를 subclassing해야 한다나 뭐라나..
    // 하지만 이게 쉬운 것이 아니니 그냥 UIGestureRecognizer를 구현하라고 한다.
    // 그래서 이 소스에서는 이 가이드를 따라 ViewDidLoad에서 UIGestureRecognizer를 구현했다.
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        debugPrint("touchesBegan")
        super.touchesBegan(touches, withEvent: event)
        activeField!.endEditing(true)
    }
    
  • touhesBegan의 대안 소스
    이것도 swift 버전별로 약간의 변경 사항이 많아 오류 안 나게 하는데 좀 시간이 걸렸다.
    swift 2.2에서는 호출되는 메소드에 파라미터가 있으면 안 된다.

    override func viewDidLoad() {
        super.viewDidLoad()
    
        self.performSelector(#selector(registerKeyboardEvent))
    
        setupUI()
    
        collectionView.dataSource = self
        collectionView.delegate = self
    
        let dismissTap = UITapGestureRecognizer(target: self, action: #selector(handleTap))
        self.view.addGestureRecognizer(dismissTap)
    }
    
    func handleTap() {
        debugPrint("touchesBegan")
        if let af = activeField { 
            af.endEditing(true)
        }
    }