iOS/UIKit

[UIKit] 마주한 첫 번째 에러 (this class is not key value coding-compliant for the key)

kyxxn 2024. 1. 18. 01:38
728x90

"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로 구현되어 있어서 그렇다고 생각했고,

오류가 발생하지 않게 구현을 잘 해야겠다고 느낌