스위프트 자주 실수하는 오류 this class is not key value coding-compliant for the key
this class is not key value coding-compliant for the key
Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<SSAC_DrinkWater.DrinkWaterViewController 0x102805140> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key profileButton.'
terminating with uncaught exception of type NSException
(lldb)
this class is not key value coding-compliant for the key profileButton.
코드를 작성하던 중 이런 오류가 떠서 계속 실행이 안됐다.
빌드를 하면 아무 오류도 나지 않았고, 방금까지 실행한 것 같은데.. 코드는 똑같은데..? 하면서 찾아봤다.
해결 방법은 생각보다 간단!
먼저 이게 어떤 의미인지부터 알아보자면,
this class is not key value coding-compliant for the key profileButton.'
→ Xcode가 내가 코드에 연결시켜 놓은 profileButton을 찾을 수 없다.
//@IBOutlet var resetButton: UIBarButtonItem!
//@IBOutlet var profileButton: UIBarButtonItem!
나의 코드를 보면, 나는 처음에 버튼 두 개를 IBOutlet으로 연결해 놓고, 사용하지 않을 것 같아서 주석처리를 해놨다. 이건 사용안하겠다고 한거니까 상관없을 것 같아서 배제시켜놓고 애꿎은 코드만 계속 수정해봤다. 하지만 문제는 여기에,,

뷰를 선택하고 인스펙터를 보면 저렇게 오류가 떠 있는 것을 알 수 있다.
Xcode입장에서는 연결이 있었는데요? 없었습니다.. 하는 것 같았겠지,,
저 부분을 x 버튼 눌러 지워주면 오류는 해결된다.
📌Outlets 연결해 주었을 때, 코드 상에서 이름을 바꾸거나 연결을 해제해 주었을 때는 꼭! Connections Inspector에서도 변경사항을 반영해 주어야 한다.
...하지만 이렇게 쓰고도 나는 계속계속 같은 오류로 머리를 쳤다,,
🐾🐾 오늘 SSAC 수업을 듣던 중 선생님께서 연결 관계에 대해서 이야기를 해 주셨다!

@IBOutlet 들을 찬찬히 살펴 보면 모두 옵셔널을 강제 해제 하고 있는 것을 볼 수 있다.
! 를 사용하여 강제 해제를 하는 경우에는, 확실하게 그 값이 존재할 때 풀어주는 것이다.
그런데 만약 연결이 되어 있지 않는다면, 옵셔널 값이 nil인 상태에서 해제를 시키기 때문에 nil을 반환한다.
즉 소스에서는 지웠지만 버튼 기능에는 아직 액션기능이 연결되어 있어서 액션기능을 삭제 해줘야 한다
또는 액션으로 해야하는데 아울렛으로 했다면 버튼에서 우측 마우스 클릭하여 이전 기능 연결된 것을 삭제하고 다시 연결시키면 된다.


아래처럼 삭제하면 에러가 나지 않는다.

정말 간단하지만 찾아보면 또 10분 20분 금방 지나가니 시간이 너무 아깝다.
다들 실수 하지말고 이걸 보고 빠르게 해결했으면 좋겠다.