seong_hye, the developer

오류 해결) unrecognized selector sent to class 오류 해결 본문

IOS/UIKit

오류 해결) unrecognized selector sent to class 오류 해결

seong_hye 2024. 1. 6.

 

 

UIKit 화면을 코드로 만드는 연습을 하던 중 

아래와 같은 화면을 만들어 'dice game'이라는 버튼을 누름과 동시에

 

reason: '+[BasicsApps.ViewController tapDiceGameButton:]: unrecognized selector sent to class

위와 같은 오류가 발생하며 화면이 종료되었다.


나의 코드는 다음과 같았다.

private let diceGameButton: UIButton = {
        let button = UIButton()
        button.setTitle("DICE GAME", for: .normal)
        button.setTitleColor(.black, for: .normal)
        button.layer.masksToBounds = true
        button.layer.cornerRadius = 5
        button.backgroundColor = .lightGray
        button.addTarget(ViewController.self, action: #selector(tapDiceGameButton), for: .touchUpInside)
        return button
    }()
    
     @objc func tapDiceGameButton(_ sender: UIButton) {
        let diceView = DiceGameViewController()
        self.navigationController?.pushViewController(diceView, animated: true)
    }

오류의 원인이 무엇일까?

 

1. storyboard로 개발 시, 하나의 버튼에 두 개 이상의 IBAction이 연결된 경우

하지만 코드로 진행중이기에 해당 사항이 없다.

 

2. button의 target연결이 잘못 되었을 경우

button의 addTarget 함수의 경우

 



첫번째 파라미터: target

대상 개체, 즉 action method가 호출된 개체를 의미하고

nil을 지정하면 UIKit에서는 지정한 action 메시지에 응답하는 개체를

응답자 체인에서 검색하여 해당 개체로 메시지로 전달한다.

 

두번째 파라미터: action

호출할 작업 메서드를 식별하는 선택자

 

세번째 파라미터: controlEvents

액션 메서드가 호출되는 컨트롤 별 이벤트를 지정하는 비트 마ㅅ크

항상 적어도 하나의 상수를 지정해야 하며

가능한 상수 목록은 UIControl.Event이다.

즉, 어떤 식으로 버튼을 선택했을 때를 의미하는 파라미터이다.


그렇담 내 코드에서 문제가 되는 부분은 아래 부분이며

diceGameButton.addTarget(ViewController.self, action: #selector(tapDiceGameButton), for: .touchUpInside)

 

첫번째 파라미터인 ViewController.self가 문제라는 뜻이다.

위의 경고 메시지를 바탕으로 수용해 self -> ViewController.self로 바꿨던게 문제가 된 것인가 싶어

여기서 경고를 무시하고 self로 바꾸니 잘 실행되었다.

 

그렇다면 왜 경고로 ViewController.self로 바꾸라고 하고 바꾸면 문제가 발생할까?

button 클로저 실행문 안에 있어서 그런가 싶은 생각이 들어

실행문 밖으로 꺼내 다른 함수안에 넣으니 문제 없이 진행되는 모습을 확인할 수 있었다.

diceGameButton.addTarget(self, action: #selector(tapDiceGameButton), for: .touchUpInside)

 

Comments