서론
이번 포스팅에서는 "key value coding-compliant" 오류에 대해서 다뤄보려고 합니다.
갑자기 뜬금없이 에러에 다룬다고 생각할 수도 있는데 iOS 앱을 개발하다보면 많이 만나게 되는 오류고 이런 오류가 발생했을 때 딱히 나와 있는 곳이 잘 없더라고요. 그래서 저도 iOS 개발에 막 입문 했을 때 많이 애 먹었던 오류라서 한 번 여러분들한테도 이 에러와 해결방법에 대해서 설명해드리려고 합니다!!
key value coding-compliant 오류란?
이 오류는 "setValue:forUndefinedKey:"라는 메소드를 호출할 때 발생하는 "key value coding-compliant" 오류입니다. 이 오류는 특정 클래스가 지정된 키에 대한 Key-Value Coding(KVC)을 지원하지 않을 때 발생합니다.
일반적으로 이 오류는 IBOutlet이나 IBAction을 연결할 때 발생하는 경우가 많습니다.
Xcode 화면을 보면서 좀 더 자세히 알아보도록 하겠습니다.
key value coding-compliant 오류 발생 과정
Xcode에서 프로젝트 파일을 하나 만들고 Label과 Button Object를 각각 하나씩 만들고 ViewController에 Label의 이름은 L1으로 Button의 이름은 btnB1으로 설정하고 연결해준 상태입니다.
자 여기서 제가 갑자기 Label의 이름을 바꾸고 싶을 수도 있잖아요?
그럴 때 그냥 아래처럼 Label 이름을 바꾸고 소스에서 Label 기존 이름을 새로 만든 이름으로 바꾼다면 어떻게 될까요?
물론 소스상으로는 아무런 문제도 없고 이론적으로도 틀린 부분은 없기 때문에 빌드를 해보면 정상적으로 실행이 됩니다.
하지만 문제는 시뮬레이션에 들어오는 순간 발생하게 됩니다.
바로 이렇게 빌드가 멈추면서 갑자기 AppDelegate 화면으로 넘어오고 콘솔창에는 이상한 에러 메세지가 막 뜨게 됩니다.
굉장히 당황스럽죠?
우리는 이름을 변경하고 나서 소스상에서도 정상적으로 바꿔줬는데 말이죠..
에러가 발생하는 이유는 연결이 잘못되어 있기 때문입니다.
View Controller에서 오른쪽에 connection inspector를 보면 현재 연결이 되어 있는 관계를 볼 수 있는데 노란색 경고문이 있는 부분을 보면 우리가 없앤 L1이 아직도 연결이 되어 있는 모습을 확인할 수 있습니다.
바로 요녀석 때문에 소스상으로는 문제가 없지만 빌드를 해보면 에러가 발생하는 거죠.
해결방법
해결방법은 간단합니다!
경고문이 있는 L2 칸에 있는 x를 눌러서 없애주면 됩니다! 정말 쉽죠?
자 x를 눌러서 제거해주고 다시 빌드를 해봅시다!
자 이렇게 아무 문제 없이 깔끔하게 실행되는 것을 확인할 수 있습니다!
해결 방법을 글로 정리해보자면
1. Xcode에서 해당 클래스와 해당 키("lblHello") 간의 연결이 올바르게 설정되어 있는지 확인하기. IBOutlet이나 IBAction과 연결된 UI 요소나 메소드가 올바른 클래스에 속해 있는지 확인하기
2. 스토리보드 또는 xib 파일에서 해당 UI 요소의 연결이 올바른지 확인하기. "lblHello"라는 이름의 IBOutlet이 있는 경우 해당 IBOutlet이 올바른 클래스와 연결되어 있는지 확인하기
3. 만약 "lblHello"라는 이름의 IBOutlet이 없는 경우, 해당 IBOutlet을 추가하고 올바른 클래스와 연결하기
4. 만약 "lblHello"라는 이름의 IBOutlet이 있지만, 올바른 클래스와 연결되어 있지 않은 경우, IBOutlet을 삭제하고 다시 추가하여 올바른 클래스와 연결하기
이정도로 정리할 수 있겠네요!
마무리
이번 포스팅에서는 제가 iOS 개발 초기 때 많이 고생했던 오류와 해결 방법에 대해서 알아봤는데 진짜 이 간단한 걸 왜 그렇게 어려워 했었나 싶네요... 이 글을 읽으신 분들은 저처럼 고생하지 않길 바랍니다~!!
감사합니다.
틀린 부분이 있거나 더 좋은 내용 훈수 환영합니다!
공감과 댓글 부탁드립니다.
'Apple > iOS' 카테고리의 다른 글
[iOS] Xcode 기능 정리 (0) | 2023.11.14 |
---|---|
[iOS] 앱 아이콘 넣는 방법 (0) | 2023.11.12 |
[iOS] Image View와 카운팅 기능 (0) | 2023.11.08 |
[iOS] Playground에서 UIView 사용하기 (0) | 2023.11.07 |
[iOS] 아이폰 이름 출력 앱 만들기 (2) | 2023.11.04 |