Xcode- 'NSUnknownKeyException'을 수정하는 방법, 이유 :…이 클래스는 키 X에 대한 키 값 코딩 호환이 아닙니까? "


1172

나는 연결하기 위해 노력하고있어 UILabelIBOutlet내 수업에서 만들었습니다.

내 응용 프로그램이 다음 오류와 함께 충돌합니다.

이것은 무엇을 의미 하는가?

어떻게 고칠 수 있습니까?

*** catch되지 않은 예외 'NSUnknownKeyException'으로 인해 앱을 종료하는 이유 : '[<UIViewController 0x6e36ae0> setValue : forUndefinedKey :] :이 클래스는 키 XXX에 대해 키 값 코딩 호환이 아닙니다.'


11
pedrotorres가 옳습니다. 네 맞습니다. UITableViewCell을 수행하는 경우 IB에서 파일 소유자를 NSObject로, UITableViewCell'Class를 정의한 .h 클래스로 만들어야합니다.
주세페

3
이러한 문제가 발생하고 문제가되는 키가 콘센트가 아닌 동작 인 경우 콘센트 변수 이름 대신 실수로 동작 함수 이름을 참조 하는 콘센트 가있을 수 있습니다 .
Alex Yursha 2016 년

2
오류 메시지의 키 이름 (OP에서 'XXXX'라고 함)은 nib 파일에있는 이름입니다. 검색 범위를 좁히는 데 도움이됩니다.
kris

rdar : // 22105925를 제출하여 Apple이 빌드 시에이 오류를 더 분명하게하도록 요청했습니다. :)
jtbandes

실제로 즉시 문제를 해결하는 방법! stackoverflow.com/a/13812660/294884 환상적인 팁
Fattie

답변:


980

xib에서 뷰 컨트롤러의 클래스가 잘못되었을 수 있습니다.

프로젝트를 다운로드했습니다.

당신이 얻는 오류는

'NSUnknownKeyException', 이유 : '[<UIViewController 0x3927310> setValue : forUndefinedKey :] :이 클래스는 키 문자열에 대한 키 값 코딩 호환이 아닙니다.'

Second뷰 컨트롤러 MainWindow.xibUIViewController대신SecondView 클래스를 가지고 있기 때문에 발생합니다 . 올바른 클래스로 변경하면 문제가 해결됩니다.

그건 그렇고, Objective-C에서 "string"과 같은 이름을 갖는 것은 좋지 않습니다. 런타임 이름 충돌을 초대합니다. 실습용 앱에서도 한 번 피하십시오. 이름 충돌은 추적하기가 매우 어려우므로 시간을 낭비하고 싶지 않습니다.

이 오류의 또 다른 이유는 한 컨트롤러에서 다른 컨트롤러로 요소를 복사하여 붙여 넣을 때 Xcode는이 요소를 새 컨트롤러로 편집하고 다시 연결 한 후에도 원래 컨트롤러에 대한 링크를 유지합니다.

이 오류의 또 다른 이유는 다음과 같습니다.

나쁜 콘센트.

당신도 한 제거 하거나 이름을 바꿀 당신의 출구 이름 .h파일을.

파일 .xib또는 .storyboard연결 관리자 에서 제거하십시오 .

하나 더 가능한 이유

(내 경우에는) 바인딩 가능한 속성을 가진 UIView 확장 및 바인딩 가능한 속성 (예 : 그림자, 모서리 반경 등)에 대한 설정 값을 UIView 확장에서 제거하십시오 (어떤 이유로 든).하지만 다음 <userDefinedRuntimeAttributes>은 xml에 남아 있습니다 ( foo.storyboard).

<userDefinedRuntimeAttributes>
  <userDefinedRuntimeAttribute type="color" keyPath="shadowColor">
      <color key="value" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
  </userDefinedRuntimeAttribute>
  <userDefinedRuntimeAttribute type="number" keyPath="shadowOpacity">
      <real key="value" value="50"/>
  </userDefinedRuntimeAttribute>
  <userDefinedRuntimeAttribute type="point" keyPath="shadowOffset">
      <point key="value" x="5" y="5"/>
  </userDefinedRuntimeAttribute>
  <userDefinedRuntimeAttribute type="number" keyPath="shadowRadius">
      <real key="value" value="16"/>
  </userDefinedRuntimeAttribute>
  <userDefinedRuntimeAttribute type="number" keyPath="borderWidthValue">
      <real key="value" value="0.0"/>
  </userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>

솔루션 : 마우스 오른쪽 버튼으로 클릭 foo.storyboard> 소스 코드로 열기> keyPath로 검색 (예 : shadowRadius)> </userDefinedRuntimeAttributes>문제를 일으킨 원인 삭제


9
또한 펜촉의 "보기"콘센트를 파일 소유자의보기 콘센트 (UIViewController에서 상속 된 사용자 정의 클래스의보기 콘센트)에 연결하는 것을 잊지 마십시오. "플레이스 홀더"의 "파일 소유자"에서 "오브젝트"의 "뷰"로 드래그하여 뷰 콘센트를 선택하여 제어 할 수 있습니다.
Nirma

1
모든 클래스가 이미 설정되어 있는지 확인했지만 NSUnknownKeyException이 여전히 나옵니다. (
Zennichimaro

1
Interface Builder를 사용하지 않아도이 오류가 계속 발생합니다. 무슨 일이야?
sudo

12
신경 쓰지 마. Xcode는 프로젝트에서 제거되었지만 메인 스토리 보드에 여전히 액세스하고 시뮬레이터는 캐시했습니다. 스토리 보드 나 NIB를 사용하는 것은 매우 권장되지 않습니다.
sudo

5
@ 조쉬 롤. xcode에서 네이티브 앱을 만들려는 동기를 가질 때마다 항상 하루 종일 무언가를하는 방법을 알아 내려고 노력합니다. 저는 AC # 개발자이므로 최근 Xamarin 및 Telerik (네이티브 스크립트)의 제품을보고있었습니다.
머핀 맨

1524

xib에 연결이 잘못되었을 수 있습니다.

이 오류가 여러 번 발생했습니다. 이 경우 TechZen의 답변이 절대적으로 맞지만 다른 일반적인 원인은 .h / .m에서 IBOutlet 속성의 이름을 이미 펜촉의 File 's Owner에 연결 한 경우입니다.

펜촉에서 :

  1. IB에서 객체를 선택하고 'Connections Inspector'로 이동하십시오.
  2. 'Referencing Outlets'에서 객체가 여전히 이전 속성 이름에 연결되어 있지 않은지 확인하십시오. 만약 존재한다면 작은 'x'를 클릭하여 참조를 삭제하고 다시 빌드하십시오.

    여기에 이미지 설명을 입력하십시오

스토리 보드를 사용하는 경우 또 다른 일반적인 원인은 UIButton에 둘 이상의 할당이있을 수 있습니다 (솔루션은 펜촉과 거의 동일 함).

  1. 스토리 보드를 열고 UIButton을 마우스 오른쪽 버튼으로 클릭하십시오.
  2. 이 버튼에 할당 / 참조가 둘 이상 있음을 알 수 있습니다. 작은 "x"가있는 "주요 ..."회색 창 중 하나를 제거하십시오.

    예 2


1
감사! 내 경우에는 동일한 뷰에 2 개의 콘센트가 있었고 오래된 것을 제거하고 새 뷰에 연결하면 예외가 끝났습니다.
Mark Patterson

광산은 두 번 복제되었습니다. Pro 버전 (Lite 버전)에서 다른 프로젝트의 연결에 매달려 있다고 생각한 후 끌어서 놓은 후에 각 연결을 끊기 시작했습니다. 중복을 발견하고 연결을 끊는 데 3 번의 클릭이 걸렸을 때 3 일 전에 그 일을 진심으로 바랐습니다. 아 잘-개발자의 삶입니다.
aremvee 2016 년

UIButton에 둘 이상의 할당이 있다는 문제가있었습니다. 이것은 내 문제를 해결했습니다.
mythicalcoder

나도이 문제가 있었다. 슈퍼 뷰 대신 특정보기에서 콘센트 연결을 확인하는 것을 잊지 마십시오. 내 경우에는, superviews 잘못된 연결 = / 표시되지 않은
아우 카르 모

GUI를 사용하여 아직 페이지를 만들지 않은 잘못된 ViewController swift 파일에 버튼 콘센트를 연결했을 때 비슷한 오류가 발생했습니다.
brw59

114

이 오류를 없애기 위해 시뮬레이터 / iPhone에서 앱을 삭제해야했습니다.


1
+1이 문제가 해결되었습니다. IB를 사용하는 코드를 정리하고있었습니다. 코드에서 버튼을 삭제하면 nib 파일 에서이 버튼이 전혀 참조되지 않은 경우에도 오류가 계속 나타납니다 (적어도 볼 수 있음).
일요일 월요일

2
동일한 이름을 가진 두 응용 프로그램을 디버깅하는 경우 이것이 필요하다는 것을 알았습니다.
Anton

그러나 XIB의 무언가가 시뮬레이터에 캐시되어있는 것 같습니다. 실제로 오래된 앱을 삭제하고 싶지 않기 때문에 업그레이드를 테스트하는 경우 고통 스럽습니다.
Carlos P

XIB 파일을 삭제하는 데이 문제가 발생했습니다. 문제가 해결되었습니다.
balboa

4
앱 삭제가 작동하지 않으면 XCode DerivedData 폴더를 삭제하십시오. 잘못된 xib 파일을 캐시 할 수 있습니다. XCode-> 환경 설정-> 위치-> DerivedData 폴더를 열고 휴지통으로 드래그하십시오.
Philip Fung

107

테이블에 대한 사용자 정의 ViewCell을 구현하려고 할 때이 오류가 발생했습니다. XIB에 대한 View 컨트롤러를 강조 표시하고 CellView의 요소에 연결하면 "이 클래스는 키에 대해 키 값 코딩 호환이 아닙니다"라는 오류가 발생하면 오류를 제거했습니다.

아래 이미지에서 연결을 삭제하십시오. 파일 소유자가 강조 표시되면 인스펙터에서 연결 삭제

테이블 뷰 셀에만 연결되어 있는지 확인하십시오. 테이블보기 셀과 INSPECTOR에서 클릭을 확인하려면 연결을 찾으십시오.

테이블 뷰 셀이 강조 표시되면 연결이 여기에 있어야합니다.


4
이것은 나를 위해 그것을했습니다, 정말 고마워요. 왼쪽 열에서 "File 's Owner"가 선택되면 연결을 해제 한 다음 내 사용자 지정 셀을 선택하고 다시 연결했습니다. 성공!
Rogare

xcode7에서도 작동하지만 오른쪽 패널 "연결 관리자"를 사용하십시오. 테이블 뷰셀과 레이블에서 콘센트를 제거한 다음 다시 추가하면 모든 것이 작동합니다.
lifeisfoo

3
이것은 작동하지만 FileOwner가 설정되지 않았는지 확인해야합니다! 파일 소유자는 NSObject로 남아 있어야합니다. stackoverflow.com/questions/13793162/…
devjme

같은 대답으로 저를 두 번 구했습니다!
wm.p1us

98

때때로 이것은 "Inherit From Target"과 관련이 있습니다. 그 값을 설정해야합니다. 단일 대상 앱을 사용하면 대상에서 상속을 선택할 수 있습니다. 하나 이상의 대상이있는 경우 원하는 대상을 선택하십시오.

여기에 이미지 설명을 입력하십시오


이 답변은 특정 사례에 도움이되었습니다. 여러 대상이있는 오래된 obj-c 프로젝트에서 계속 작업해야합니다. Swift에서 사용자 정의 UITableViewCell을 작성하고 동일한 오류가 발생했습니다. "Inherit From Target"을 활성화하면 효과가있었습니다. 감사합니다!
magohamoth

모듈이 항상 올바르게 설정되어 있지는 않습니다. 예를 들어 실제로 클래스를 작성하기 전에 클래스 이름을 채우는 경우.
Johan

IDE가이 플래그를 자동으로 확인하지 않도록 마지막에 "Enter"키를 누르지 않고 클래스 이름을 채웠습니다. 이것에 1 시간을 낭비했습니다. 감사합니다.
MatPag

obj-c에서 이러한 유형의 오류가 발생하지 않았습니다. 그러나 그 미스터리를 해결해 주셔서 감사합니다.
Pradeep Kachhawaha

왜 이것이 3 페이지에 묻혀 있습니까?
Sergio

65

범용 앱이 아닌 iPhone 전용 앱인 경우 다음 필드가 비어 있는지 확인하십시오.

대상> 요약> iPhone / iPod 배포 정보> 기본 인터페이스

xib를 지정하면 충돌이 발생합니다.


2
그렇습니다. 새로운 시작보기 컨트롤러를 추가하기 위해 주위를 비비는 동안 이것을 새로운 클래스 / 펜으로 설정했습니다. 뷰 콘센트를 연결 한 후이 오류가 발생했습니다. 이 필드를 지우면 문제가 해결되었습니다.
terriblememory

이것은 나를 위해 일했습니다. 또한 장치 / 시뮬레이터에서 이전 버전을 삭제해야 작동했습니다.
jimt

고마워-이것은 내 문제였다. iPad 스토리 보드 파일의 이름을 바꾸었고 프로젝트 환경 설정에서 업데이트하지 않았습니다.
RobertJoseph

2
감사합니다! 이것은 나를 위해 해결했습니다. (메인 인터페이스 필드를 비워 둔 후 시뮬레이터에서 앱을 삭제해야했습니다. 단순히 해당 필드를 변경해도 시뮬레이터가 캐시를 깨뜨리지는 않았습니다.)
snipe

범용 앱에서 아이폰 전용 앱으로 변경 한 것을 기억하고 오류가 수정되었습니다!
저스틴

59

이 오류는 이미 연결된 Interface Builder 객체가 소유자의 소스 (파일 소유자)에서 제거 / 이름 변경 되었음을 나타냅니다 .

느낌표가 표시 되면 Interface Builder에서 파일 소유자 를 Control- 클릭하십시오 .

아래 그림에서 "aRemovedView"의 오른쪽에 느낌표가 있음을 알 수 있습니다. 이는 IB에 이미 연결된 상태에서 IBOutlet보기 객체를 제거했기 때문입니다.

여기에 이미지 설명을 입력하십시오

잡히지 않는 예외 'NSUnknownKeyException'으로 인해 응용 프로그램을 종료하는 이유 는 다음과 같습니다 . '[setValue : forUndefinedKey :] :이 클래스는 키 aRemovedView 에 대해 키 호환 코딩 키가 아닙니다.'


감사합니다! 이것은 나를 위해 그것을 고쳤다. 나는 오랫동안이 문제를 겪어 왔으며 처음부터 다시 시작하는 것 이외의 문제를 해결하는 방법을 몰랐습니다. 이것은 뷰 컨트롤러에서 IBOutlets를 삭제했지만 여전히 소유자에서 참조 / 링크되었음을 알지 못했습니다 (이 경우 인터페이스 빌더-Xcode 6의 "View Controller").
Ira Herman

41

나는 같은 문제를 겪었고 TechZen의 답변은 정말 놀랍지 만 내 상황에 적용하기가 어렵다는 것을 알았습니다.

결국 나는 파일 소유자 대신 객체 (아래 이미지에서 강조 표시됨)에 나열된 컨트롤러를 통해 레이블을 연결하여 문제를 해결했습니다 .

도움이 되었기를 바랍니다.

여기에 이미지 설명을 입력하십시오


37

필자의 경우 스토리 보드 소스 코드에서 오류가 발생했습니다. 다음 단계를 따르십시오.

  1. 먼저 스토리 보드를 소스 코드로여십시오
  2. 검색 <connections>
  3. 원치 않는 연결을 제거

예를 들면 다음과 같습니다.

<connections>
    <outlet property="mapPostsView" destination="4EV-NK-Bhn" id="ubM-Z6-mwl"/>
    <outlet property="mapView" destination="kx6-TV-oQg" id="4wY-jv-Ih6"/>
    <outlet property="sidebarButton" destination="6UH-BZ-60q" id="8Yz-5G-HpY"/>
</connections>

보시다시피, 이것은 코드 변수의 이름과 스토리 보드 레이아웃 xml 태그 사이의 연결입니다.)


33

여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오

내 수정은 Gerard Grundy와 유사했습니다. XIB를 사용하여 사용자 정의 UITableViewCell을 만들 때 UITableViewCell 대신 파일 소유자에 사용자 정의 클래스 이름을 잘못 적용했습니다. 캔버스에서 UITableViewCell에 클래스를 적용하고 IBOutlet 속성을 연결하면 문제가 해결되었습니다.


Ayyy dag nab it ... 얼마나 자주이 실수를하는지 믿을 수 없습니다. 감사합니다 lol
Benjamin

31
  1. ivar 레이블이 불필요하게 IBOutlet한 번만 지정 하면 IBOutlet됩니다.
  2. ?를 사용하여 NIB를 인스턴스화하고 UIViewController있습니까? 어느 시점에서 당신은 전화해야합니다[SecondView initWithNibName:@"yourNibName" bundle:nil];

도움이되었습니다! 다른 뷰 컨트롤러에서 속성에 대한 키-값 코딩 준수 오류가 발생했습니다. 내가 -initWithNibName잘못된 펜촉 이름 으로 전화 한 것으로 나타 났습니다 .
jlstrecker

예 어쨌든 주셔서 감사합니다 ...이 내가 대신 MyCustomeViewController의 UIViewController에 사용하던 .. 나도 도움이 ..하지만이 종류 있습니다 .. 자기 반성 때문에 미스 배치 클래스 객체에 실패 할 수있다 계층 구조 문제입니다
FUTUR

나는 비슷한 문제가 있었다. 우연히 동일한 두 IBAction 항목. 코드에는 UIControl (내 경우에는 UIStepper)을 마우스 오른쪽 버튼으로 클릭하면 표시되지 않았습니다. 하나를 삭제하면 해결되었습니다.
Dave Hubbard

30

이것은 장치 (iPhone)에서 디버깅 할 때만 발생했습니다. iOS 시뮬레이터가 정상적으로 작동했습니다. Xcode에서 "Product-> Clean"을 수행하면 문제가 해결되는 것처럼 보이지만 그 이유를 모르겠습니다.


이것은 내 문제를 해결합니다. tsk2x 거의 3 일의 두통.
user3818576

5
질문에 대한 답변을 제공합니다. 펜촉에 문제가 생겨서 깨끗하게 해결했습니다. 나는 위의 모든 것을 읽고 사용해 보지 못했고 청소를했고, 그것을 고치려고 1 시간 후에 Maj의 해결책으로 고쳤다. 나는 XML에서 무엇이 이것을 일으킬 수 있었는지 알고 싶었지만 계속 움직였다.
LevinsonTechnologies

이것은 실제로 문제를 해결합니다. 위의 많은 제안을 시도했으며 프로젝트가 갑자기 시작된 오류를 깨끗하게 수정했습니다. Ugg ...
DustinB

이것은 내 문제를 해결하고 위의 제안을 많이 시도했습니다. 이상해 보인다!
Naveen Shan

23

나는 http://www.idev101.com 에서 Kira에게 똑같은 오류 메시지와 감사 (!!)를 받았으며 도전을 해결할 수있었습니다. 인터넷 검색 및이 모든 스레드를 쌓은 후에 그녀의 사이트를 찾았습니다. 나는 이제 다음에 StackOverFlow에 대해 게시하고 있으며 그 사람이 Google을 통해이 스레드에 올 가능성이 있기 때문에 내가 겪었던 것과 동일한 도전을 위해 여기에 게시하고 있습니다.

나는 이것을 잘못 만들었다는 것을 깨달았다.

UIViewController *deviceViewController = [[UIViewController alloc] initWithNibName:@"DeviceViewController" bundle:nil];

이 대신 :

DeviceViewController *deviceViewController = [[DeviceViewController alloc] initWithNibName:@"DeviceViewController" bundle:nil];

어디

DeviceViewController

내 클래스의 이름은

DeviceViewController.h 
DeviceViewController.m

당신은해야합니다

"import DeviceViewController.h"

예를 들어 다른 UIViewController를 호출하려는 구현 (.m 파일)에서.

나는 나와 같은 초보자에게 명백한 것을 말하고 질문과 정확하게 관련이 없기 때문에 투표를받을 수 있지만 절대로 미안하지 않습니다.이 오류 메시지에 대한 답을 찾기 위해 지금 4 시간 (?!?) 시간을 검색했습니다. . 내가 이것을 1-2 명에게 줄 수 있다면 좋을 것입니다 :)

추신 : 코드가 다른 UIViewController를로드하는 방법에 관심이있는 사람들을 위해 :

    [self presentViewController:deviceViewController animated:YES completion:nil];

Xcode 5를 사용하고 있으며 기본적으로 스토리 보드 만 추가 할 수 있기 때문에 수동으로 펜촉을 추가하는 방법을 실제로 알지 못했습니다 .... 몇 가지 지침이 있지만 세부 사항은 아닙니다. 정말 도움이되었습니다 !!
Pittfall

"이 잘못 만들었습니다 ..."고마워요. 정말 바보 같은 실수로 많은 돈을 쓴 것은 이번이 처음이 아닙니다
tonCDCD

23

컨트롤을 끌어서 콘센트 나 액션을 생성하여 삭제하는 것을 잊었을 수 있습니다. 코드를 삭제했거나 cmd + Z를 충분히 만들었더라도 스토리 보드의 연결 관리자로 이동하여 생성 한 작업 또는 콘센트가 여전히 여기에 있는지 확인해야합니다.


감사! 나는 Xcode의 n00b이고 불량 링크를 찾는 데 시간이 걸렸습니다. Xcode 9.2에서는 스토리 보드보기에서 요소를 마우스 오른쪽 단추로 클릭하고 "참조 콘센트"를 확인할 수 있습니다.
kunigami

21

다른 답변을 살펴보면이 오류를 일으킬 수있는 많은 것들이있는 것 같습니다. 여기 하나 더 있습니다.

만약 너라면

  • 사용자 정의보기
  • @IBInspectable 속성을 추가했습니다
  • 나중에 삭제

그러면 다음과 유사한 오류가 발생할 수 있습니다

[사용자 정의보기]에서 사용자 정의 검사 속성을 설정하지 못했습니다 (xxx) ... :이 클래스는 키 [xxx]에 대해 키 값 코딩 호환이 아닙니다.

해결책은 이전 속성을 삭제하는 것입니다.

여기에 이미지 설명을 입력하십시오

클래스의 아이덴티티 인스펙터를 열고 사용자 정의 런타임 속성에서 속성 이름을 선택한 다음 빼기 버튼 (-)을 누릅니다.


나는이 페이지에서 너무 자주왔다 ... 이번에는이 솔루션이 그것을 만들었다! 그러나 삭제하는 오래된 속성이 실제로 충돌하는 속성이 아닌 다른 ViewController에 있다고 들리면 이상하게 생각합니다.
Cinn

15

이것은 뷰 컨트롤러에 원래 .xib 파일이 있었지만 이제는 프로그래밍 방식으로 만들어 졌을 때 발생합니다.

이 프로젝트에서 .xib 파일을 삭제했지만. 사용자 iPhone / iPad에는이 뷰 컨트롤러에 대한 .xib 파일이 포함되어있을 수 있습니다.

.xib 파일을로드하려고하면 일반적으로이 충돌이 발생합니다.

Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<UIViewController 0x18afe0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key welcomeLabel.'

프로그래밍 방식으로 만들 때 해결책은 다음과 같습니다.

-(void)loadView {
    // Ensure that we don't load an .xib file for this viewcontroller
    self.view = [UIView new];
}

12

Identity Inspector에서 View Controller의 "Module"속성이 예상과 다를 수 있습니다. 또한 새 클래스가 대상 목록에 추가되어 있는지 확인하십시오.


제 경우에는 투표를했습니다. Swift와 Storyboards를 사용하고 있습니다. 빌드 변형을 만들기 위해 새 빌드 대상을 만들면 새 변형에서 앱이 작동하지 않는 반면 첫 번째 대상은 정상적으로 작동했습니다. 모듈 이름이 어떻게 든 첫 번째 대상에서 모듈로 설정된 View Controller에서 앱이 중단되었지만 View Controllers 작업에서 Current- <module name here> 입니다. 이 경우 모듈 이름을 지워야합니다.
Mixaz

11

두 개의 대상 (자체 MainWindow XIB 포함)이있는 프로젝트에서도 비슷한 문제가있었습니다. 이 오류를 발생시킨 근본적인 문제는 UIViewController 클래스가 두 번째 프로젝트의 리소스 목록에 포함되지 않았다는 것입니다. 즉, 인터페이스 빌더를 사용하면 MainWindow.xib에서 지정할 수 있지만 런타임에 시스템에서 클래스를 찾을 수 없습니다.

즉, 문제가있는 UIViewController 클래스를 cmd 클릭하고 'Targets'탭에 포함되어 있는지 다시 확인하십시오.


9

이 오류도 발생했기 때문에 여기에 추가하십시오. 이 모든 대답을 겪는 것은 UI 및 스토리 보드 작업에 적용되는 것 같습니다. 나는 원래 포스터가 UI와 함께 작동하는 것처럼 보였지만이 오류의 가능한 이유를 검색 할 때 대부분의 모든 질문은 다른 질문이 복제본으로 닫히거나 스토리 보드의 물건을 연결하는 데 문제가 있으므로이 질문으로 돌아갑니다. 내 솔루션을 추가하십시오.

Swift 2에서 웹 서비스 코딩 작업을하고있었습니다. 필요한 프록시 개체와 스텁을 모두 만들었습니다. 반환 된 XML을 반복하면서 객체를 모두 인스턴스화 NSObject하고 사용 setValue:forKey했습니다. setValue:forKey속성을 설정하려고 할 때 마다이 오류가 발생했습니다.

난과 (예를 들어 처리 된 각 유형의 스위치 문이 있었다 Bool?, CShort?, String?) 내가 겪은과 유형 개체에 대해 무엇인지 확인하고 그 유형으로 값을 변환으로 설정하려고 각 XML 노드를 setValue:forKey.

결국 나는이 모든 setValue:forKey줄을 주석 처리하기 시작했고 내 defaultswitch statement case가 효과가 있음을 알았습니다 String?.

나는 마지막으로 당신이 것을 생각 할 수 와 옵션 빠른 유형을 사용 setValue:forKey그들은 같은 목표 - C 형에 직접 매핑이없는 경우 String?NSNumber?. 직접 매핑이 있기 때문에 모든 CShort?유형을 변경했습니다 NSNumber?. 들어 Bool?내 경우에는 그냥 사용 나를 위해 벌금을했다 Bool그리고 그것을 초기화 false. 다른 사람들에게는 그런 사치가 없을 수도 있습니다.

어쨌든 이것은 매우 어려운 두통으로 비슷한 문제를 겪고있는 다른 사람에게 도움이되고이 질문으로 계속 리디렉션되어 "UI에서 아무 것도하지 않습니다 !!"라고 스스로에게 말합니다.

마지막으로 한 번 더 반복해서 키-값 코딩은 옵션과 함께 작동하지 않습니다. 아래에서 나는 어딘가를 찾았지만이 글을 올린 사람에게 어디에서 사과했는지, 내가 이것을 어디서 찾았는지 기억하면 신용을 줄 것입니다.

KVC는 Cocoa / Objective-C이고 Objective-C는 Optional Int를 볼 수 없으므로 Objective-C에 브리지되지 않으므로 Optional Int 속성에서 KVC를 사용할 수 없습니다. Objective-C는 Objective-C에 연결된 유형 만 볼 수 있습니다.

NSObject에서 파생 된 클래스 유형

@objc로 노출되는 클래스 유형

다리가 연결된 스위프트 구조체


1
Cocoa 바인딩을 통해 Swift bool 값을 연결하려는 경우 @objc 지시문으로 값을 노출해야합니다. 그렇지 않으면 실제로이 오류가 발생합니다. 이것이 가장 좋은 대답이어야합니다.
jvarela

9

"이 클래스는 키 값 코딩 키와 호환되지 않습니다"조금 늦었지만 답변이 다르므로 게시해야한다고 생각합니다. 두 번째 컨트롤러를 잘못된 방식으로 푸시했습니다. 샘플은 다음과 같습니다.

컨트롤러를 푸시하는 잘못된 방법

UIViewController* controller = [[UIViewController
 alloc]initWithNibName:@"TempViewController" bundle:nil];
         [self.navigationController pushViewController:controller animated:true];

올바른 방법

TempViewController* controller = [[TempViewController
 alloc]initWithNibName:@"TempViewController" bundle:nil];
         [self.navigationController pushViewController:controller animated:true];

위와 같은 답변을 찾지 못했기 때문에 동일한 문제가있는 사람에게 도움이 될 수 있습니다.


8

Xib 인터페이스에서 이름을 바꾸거나 삭제 한 구성 요소를 참조하는 경우 일 수 있습니다. 재 참조가 저에게 효과적입니다.


8

방금 중복 프로젝트 에서이 문제가 발생하여 2 곳을 확인하여 해결했습니다.

1- 목록에 .m 파일이 있는지 확인하십시오-> 프로젝트-빌드 단계-소스 컴파일
2-그런 다음 인터페이스 빌더로 이동하여 (아마도 IB에서만 오류가 발생합니다) 모든 속성, 레이블, 이미지의 링크를 해제하십시오 등 ... 그런 다음 모두 다시 연결하십시오. 속성을 제거했지만 여전히 IB에 연결되어 있음을 깨달았습니다.

그것이 효과가 있기를 바랍니다.


7

내가 찾은 또 다른 "비준수"문제는 어떤 이유로 수업의 사본 두 개를 관리 할 때 발생했습니다.

잘못된 사본에 키를 추가하고있었습니다. Interface Builder는 여전히 키를보고 연결시켜 주었지만 런타임에 새 키가없는 다른 클래스 사본을 사용하고있었습니다.

"올바른"사본을 찾으려면 XCode의 cmd를 다른 곳에서 클래스 이름을 클릭하여 올바른 사본으로 이동 한 다음 사용하지 않은 잘못된 사본을 제거했습니다 (사용하지 않은 사본에서 내 편집 내용을 먼저 가져온 후).

이야기의 교훈 : 중복 클래스 파일은 나쁘다.


7

이 오류는 다른 것입니다!

여기 내가 고 쳤던 방법이 있습니다. xcode 버전 6.1.1을 사용하고 swift를 사용하고 있습니다. 앱에서 다음 화면으로 넘어 가기 위해 segue를 수행하려고 할 때마다이 오류가 발생했습니다. 여기 내가 한 일.

  1. 버튼이 올바른 작업에 연결되어 있는지 확인하십시오. (문제는 아니지만 여전히 확인하는 것이 좋습니다)
  2. 버튼에 실수로 만든 추가 작업이나 콘센트가 없는지 확인하십시오. (이것은 문제가 아니지만 여전히 확인하는 것이 좋습니다)
  3. 로그를 확인하고 NEXT SCREEN의 모든 버튼에 올바른 동작이 있는지 확인하고, segue가있는 경우 고유 식별자가 있는지 확인하십시오. (이것은 문제였다)
    • segues 중 하나에 고유 식별자가 없습니다
    • 버튼 중 하나에는 실수로 만든 액션과 2 개의 콘센트가 있습니다.
    • 추가 콘센트를 삭제하고 다음 화면의 고유 식별자가 있는지 확인하십시오.

건배,


6

나는 같은 증상을 보였습니다. 근본 원인은 소스 파일의 "대상 구성원"이 올바른 대상으로 설정되지 않았기 때문입니다. 내 수업이 빌드되어 내 앱에 포함되지 않는다는 것을 의미한다고 가정합니다.

이를 정정하려면 다음을 수행하십시오.

  1. .m 파일을 강조 표시하십시오.
  2. 오른쪽 창에서 File Inspector를 선택하십시오.
  3. "타겟 멤버십"섹션에서 적절한 빌드 대상이 선택되어 있는지 확인하십시오.

이것이 누군가를 도울 수 있기를 바랍니다.


6

문제를 일으키는 IBOutlets가있는 사용자 정의 UIViewController 서브 클래스가있는 경우 실제로 오류를 제거하기 위해 찾은 유일한 단계 세트는

.1 클래스를 UIViewController로 변경

.2 모든 콘센트를 분리합니다 (이제 모두 노란색 경고 삼각형이 표시됨). 문제가있는 콘센트를 분리하기 만하면됩니다.

.3 모든 표준 단계 수행-↑ ⌘K, 파생 데이터 삭제 (,기도 매트, 염주)

.4 응용 프로그램을 시작-문제가있는 장면으로 이동하십시오.

.5 앱을 종료하고 Interface Builder로 돌아가서 클래스를 다시 사용자 정의 클래스 이름으로 변경하십시오.

.6 콘센트를 다시 연결하십시오.

앱을 실행하면 일반적으로 키-값 준수 문제가 해결됩니다.


스토리 보드 편집기에서 장면을 복사하여 붙여 넣을 때 효과적입니다.
Mizmor

5

나의 경우에는. 병합 후 xib 파일에 콘센트가 없습니다.

Shift + Command + K

내 문제를 해결했다. 나는 프로젝트를 청소하고 재건했다.


4

제 경우에는 잘못된 펜촉을 참조하여 발생했습니다.

BMTester *viewController = [[BMTester alloc] initWithNibName:@"WrongNibName" bundle:nil];

1
뷰 컨트롤러 클래스의 이름을 바꾸고 펜촉 이름도 변경해야한다는 것을 잊어 버렸습니다. 펜촉 이름은 문자열이므로 컴파일러 오류가 없습니다.
kris

3

스토리 보드 에서이 오류가 발생했습니다. 위의 솔루션은 문제가되지 않았으므로보기 컨트롤러를 삭제하고 다시 추가하고 (물론 segue를 다시 연결하고 클래스를 다시 할당) 문제를 해결했습니다. 나는 그것이 실제로 무엇인지 알지 못하지만, 이것이 시작되기 직전에 연결된 뷰 컨트롤러 클래스의 이름을 바꿨으므로 어쩌면 무언가를했을 수도 있습니다.


이 오류가 다시 발생했습니다. 이번에는 클래스가 할당 된 새 빈 테이블 뷰 컨트롤러를 만들고 작동하지 않는 클래스는 그대로두고 segue를 이동했습니다. 이것은 효과가 있었다. 그런 다음 다시 실패 할 때까지 뷰의 모든 요소를 ​​천천히 복사했습니다. 이번에는 문제가 선택기에 대해 "사용자 정의 런타임 속성"을 할당 한 것으로 판명되었습니다 (선택기를 사용하여 선택기를 초기화 할 수 있다고 생각했기 때문에 코드에서 할 필요가 없습니다. ). 그것을 제거하면 문제가 해결되었습니다. 이 오류는 정말 끔찍합니다. 향후 릴리스에서 개선되기를 바랍니다.
대칭

3

나는 같은 문제를 겪었다. 시뮬레이터를 재설정했습니다. 버튼 컨트롤 제거 및 추가. 그리고 마침내 깨끗하게 만들었습니다. :) 스택 오버플로 덕분에. 내 코드가 좋아지고 작동하기 시작한 방법.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.