"this class is not key value coding-compliant for the key"
...
"libc++abi: terminating due to uncaught exception of type NSException"
TextField, Label, Button 컴포넌트밖에 사용하지 않았는데,
ViewController 코드 상에 문제가 없는데 컴파일하면 에러가 발생한다.
결론부터 말하자면 Swift파일의 @IBOutlet || @IBAction의 연결이 끊여졌을 때 발생하는 런타임 에러이다.
상황
1. 스토리보드 view에 Label과 TextFild, Button을 배치함
'view.backgroundColor = .purple'은 시뮬레이션에 잘 연동됐는지 디버깅 용
2. 스토리보드의 버튼을 "컨트롤 + 좌클릭"으로 코드상에 끌어두어 '@IBOutlet weak var myButton: UIButton!'으로 선언함
3. ** 내가 임의로 버튼의 이름을 바꿈 ** 여기서 문제 발생
스토리보드에서 오브젝트를 끌어와 코드에 넣으면 변수 네임을 정하라 뜨고, 이후 작성 시 자동으로 변수 선언을 해줌
그와 동시에 view에서 'Referencing Outlets'에 내가 정한 변수 명과 뷰컨트롤러 클래스 명이 뜸
자동으로 연결을 해준다 이거임
근데 내가 임의로 코드에서 변수 명을 바꿈 -> 위 에러 발생
SwiftUI과 UIKit을 동시에 배우는 나는 둘의 큰 차이점이 struct와 class 구조라 생각했다.
class는 참조 타입으로 ARC에 의해 참조 카운팅이 되고 디폴트가 강한 참조임
근데 class로 만들어진 UIKit은 스토리보드에서 코드에 끌어다 놓을 시 'weak'로 약한 참조 변수 선언됨
그래서 인스펙터 창 보면 Outlets으로 myButton 객체가 생성돼서 참조되고 있다고 뜨는데
코드에서 바꾼다고 스토리보드의 내용들이 바뀌지 않음
-> 여기서 충돌 발생
또 다른 상황
지금이야 변수명이 문제라 바로 에러가 뜨지만,
버튼 리스너의 메소드 명을 변경한다면 ?
1. 버튼의 Action을 'didButtonListner' 메소드 명으로 추가
실행 잘 되고, 버튼 누르면 디버깅 잘 됨
2. 메소드 명 변경
지금 메소드명이 서로 다른데 컴파일이 잘 돼서 빌드까지 됐음
문제는 이러면 안되는데 된다는 거임
3. 버튼을 누름
-> 에러 발생, 런타임에 에러 발생함
이러한 오류는 class로 구현되어 있어서 그렇다고 생각했고,
오류가 발생하지 않게 구현을 잘 해야겠다고 느낌
'📱 iOS > UIKit' 카테고리의 다른 글
[UIKit] UIButton 타입과 메소드 (0) | 2024.08.21 |
---|---|
[UIKit] UISegmentedControl 사용해보기 (0) | 2024.06.17 |
iOS 네트워크 통신 (1/3) - 개요 (URLSession, Alamofire, Moya) (0) | 2024.05.12 |
[프로토콜] UITextFieldDelegate 공식문서 뜯어보기 (1) | 2024.04.12 |
[UIKit] Interface Builder Outlet 연결 Strong || Weak (0) | 2024.01.24 |