일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 생명주기
- Git
- SWIFT
- weekly calendar
- actionSheet
- 글또
- K디지털기초역량훈련
- 바이트디그리
- 내_삶
- MyLife
- copy-on-write
- 주간 달력
- 연관값
- unrecognized selector sent to class
- avaliable
- 파스칼표기법
- IOS
- uikit
- 글또9기
- AnyObject
- class
- struct
- ios 개발 강의
- error해결
- On branch is up to date with ' '
- 코드스니펫
- 제어전송문
- 회고
- Switch
- 다짐글
- Today
- Total
seong_hye, the developer
오류 해결) unrecognized selector sent to class 오류 해결 본문
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)
'IOS > UIKit' 카테고리의 다른 글
UIKit) ViewController의 생명주기 알아보기 (0) | 2024.03.27 |
---|---|
UIKit) Calendar / Weekly Calendar 구현해보기 (2) | 2024.02.04 |
오류 해결) On branch is up to date with 'origin/브랜치이름'. 오류 해결 (0) | 2024.01.06 |
iOS) Calendar에 대해 알아보기 (0) | 2023.09.19 |
imageView -> setImage 하는 법 (0) | 2022.12.06 |