iOS 개발일기

[Swift] 'didSelectItemAt' 함수가 호출되지 않는 이유 본문

iOS/Swift

[Swift] 'didSelectItemAt' 함수가 호출되지 않는 이유

맨날 까먹으니 적어두자 2023. 12. 7. 17:09
func tableView(
    _ tableView: UITableView,
    didSelectRowAt indexPath: IndexPath
) { ... }

func collectionView(
    _ collectionView: UICollectionView,
    didSelectItemAt indexPath: IndexPath
) { ... }

 

위 두 함수가 호출되지 않는 이유

 

1. delegate를 설정해주지 않았을 경우

tableView.delegate = self 

collectionView.delegate = self

 

위 같은 방법은 단순한 방법이라 실수를 했을 경우가 많을 것 같네요.

 

 

2. tableView 또는 collectionView의 상위 뷰가 'tapGesture'를 가지고 있는 경우'

 

이 경우는 좀 특별한 상황인 것 같네요.

'호출이 안된다'가 아니라 두 손가락으로 탭하거나 길게 누르거나 혹은 PanGesture가 호출될때 'didSelectItemAt' 함수가 호출이 되더라구요.

 

이게 왜 이러나 싶어서 엄청 찾아봤습니다.

 

UICollectionView's didSelectItemAtIndexPath only called when selecting cell with two fingers

I'm using an UICollectionView added on top of a view with a single tap gesture recogniser. The CollectionView makes use of custom cells without any subviews. The delegate's method - (void)

stackoverflow.com

 

이 글에서 답을 찾아버렸지 뭡니까

 

만약 UITableView 또는 UICollectionView 가 하위뷰로 포함이 되어있고, 

상위 뷰에 UITapGestureRecognizer 가 추가된 상태일 경우에는 'didSelectItemAt' 의 함수가 한 손가락으로 클릭했을 경우 호출되지 않는다라고 하더라고요.

class ViewController: UIViewController {
    
    lazy var tableView: UITableView = { ... }

    override 
    func viewDidLoad() {
        super.viewDidLoad() 
     
        //tableView를 포함한 상위 뷰에서 'tapGesture'가 추가된 경우
        view.addGestureRecognizer(
            UITapGestureRecognizer(
                target: self,
                action: #selector(dismissKeyboard)     
            )
        )
        
        //tableView 화면구성
        view.addSubview(tableView)
        ...
    }
    
    @objc
    private func dismissKeyboard() {
        ...
    }
}

 

위와 같은 경우 처럼요.

 

이런 경우 'cancelsTouchesInView' 속성을 false로 설정해주시면 tableView의 'didSelectItemAt' 함수를 한 손가락 터치로 호출 할 수 있게 됩니다.

 

 

cancelsTouchesInView | Apple Developer Documentation

A Boolean value that determines whether touches are delivered to a view when a gesture is recognized.

developer.apple.com

 

let tap = UITapGestureRecognizer(
    target: self,
    action: #selector(dismissKeyboard)
)
tap.cancelsTouchesInView = false 

view.addGestureRecognizer(tap)

 

 

아직 이 외 다른 함수들에 대해서도 좀 더 알아보고 공부해야되겠네요.

 

'iOS > Swift' 카테고리의 다른 글

[Swift] 화면 캡처 감지 및 방지 방법  (0) 2024.12.31
[Swift] UITableView Dynamic Height  (0) 2024.12.26
[Swift] Custom PageViewController  (0) 2022.03.22
[Swift] JSONParser - JSONSerialization  (0) 2022.03.16
[Swift] JSONParser - Decodable(2)  (0) 2022.03.15