etc./StackOverFlow

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

청렴결백한 만능 재주꾼 2023. 4. 30. 00:07
반응형

질문자 :Community Wiki


내 클래스에서 만든 IBOutletUILabel 을 연결하려고 합니다.

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

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

어떻게 고칠 수 있습니까?

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



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

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

펜촉에서:

  1. IB에서 개체를 선택하고 '연결 검사기'로 이동합니다.
  2. '참조 콘센트'에서 개체가 여전히 이전 속성 이름에 연결되어 있지 않은지 확인합니다... 그렇다면 작은 'x'를 클릭하여 참조를 삭제하고 다시 빌드합니다.

    여기에 이미지 설명 입력

Storyboard를 사용하는 경우 또 다른 일반적인 원인은 UIButton에 둘 이상의 할당이 있을 수 있습니다(해결책은 nib의 경우와 거의 동일).

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

    예 2


Community Wiki

보기 컨트롤러의 xib에 잘못된 클래스가 있을 수 있습니다.

나는 당신의 프로젝트를 다운로드했습니다.

당신이 얻는 오류는

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

MainWindow.xibSecond View 컨트롤러에 SecondView 대신 UIViewController 클래스 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>


Community Wiki

때때로 이것은 "대상에서 상속"과 관련이 있습니다. 해당 값을 설정해야 합니다. 단일 대상 앱을 사용하면 대상에서 상속을 선택하기만 하면 됩니다. 하나 이상의 대상이 있는 경우 원하는 대상을 선택합니다.

여기에 이미지 설명 입력


Community Wiki

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

아래 이미지에서 연결을 삭제합니다. 파일 소유자가 강조 표시되면 검사기에서 연결 삭제

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

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


Community Wiki

이 오류를 제거하려면 시뮬레이터/iPhone에서 앱을 삭제해야 했습니다.


Community Wiki

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

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

거기에 xib를 지정하면 충돌합니다.


Community Wiki

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

느낌표가 표시 되면 Interface Builder에서 파일의 소유자 를 Control-클릭하여 수정해야 합니다.

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

여기에 이미지 설명 입력

이것은 다음 오류를 제공합니다. 포착되지 않은 예외 'NSUnknownKeyException'으로 인해 앱 종료, 이유: '[ setValue:forUndefinedKey:]: 이 클래스는 키 aRemovedView에 대한 키 값 코딩 호환이 아닙니다.'


Community Wiki

나는 같은 문제가 있었고 TechZen의 대답은 실제로 놀랍지만 내 상황에 적용하기가 어려웠습니다.

결국 File Owner 가 아닌 Objects (아래 이미지에서 강조 표시됨) 아래에 나열된 Controller를 통해 레이블을 연결하여 문제를 해결했습니다.

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

여기에 이미지 설명 입력


Community Wiki

제 경우에는 스토리보드 소스 코드의 오류였습니다. 다음 단계를 따르세요.

  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 태그 사이의 연결입니다.)


Community Wiki

여기에 이미지 설명 입력여기에 이미지 설명 입력

내 수정은 Gerard Grundy의 것과 유사했습니다. XIB를 사용하여 사용자 정의 UITableViewCell을 생성할 때 UITableViewCell 대신 파일 소유자에게 사용자 정의 클래스 이름을 실수로 적용했습니다. 캔버스의 UITableViewCell에 클래스를 적용하고 내 IBOutlet 속성을 여기에 연결하면 문제가 해결되었습니다.


Community Wiki

  1. IBOutlet 한 번만 지정 IBOutlet 레이블이 필요하지 않습니다.
  2. UIViewController 사용하여 NIB를 인스턴스화하고 있습니까? 어느 시점에서 [SecondView initWithNibName:@"yourNibName" bundle:nil];

Community Wiki

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


Community Wiki

나는 똑같은 오류 메시지를 받았고 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];

Community Wiki

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


Community Wiki

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

만약 너라면

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

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

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

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

여기에 이미지 설명 입력

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


Community Wiki

이것은 내 뷰 컨트롤러에 원래 .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]; }

Community Wiki

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


Community Wiki

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

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


Community Wiki

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

저는 Swift 2에서 웹 서비스를 코딩하는 중이었습니다. 필요한 모든 프록시 객체와 스텁을 구축했습니다. 반환된 XML을 반복하면서 내 개체를 동적으로 인스턴스화했습니다. 이 개체는 모두 NSObject setValue:forKey 를 사용했습니다. setValue:forKey 가 속성을 설정하려고 할 때마다 이 오류가 발생했습니다.

내가 처리하고 있던 각 유형(예: Bool? , CShort? , String? )에 대한 switch 문을 가지고 있었고 각 XML 노드에 대해 살펴보고 개체의 유형이 무엇인지 확인한 다음 값을 해당 유형으로 변환하고 시도했습니다. setValue:forKey 로 설정합니다.

setValue:forKey 행을 주석 처리하기 시작했고 default switch 문 케이스가 String? 대해 작동한다는 것을 발견했습니다. .

String? 과 같은 Objective-C 유형에 대한 직접 매핑이 없으면 setValue:forKey 와 함께 선택적 신속한 유형을 사용할 수 없다는 것을 알아냈습니다. 또는 NSNumber? . 나는 결국 모든 CShort? 유형을 NSNumber? 직접적인 매핑이 있기 때문입니다. 불을 위해 Bool? 제 경우에는 Bool false 초기화하는 것이 좋습니다. 다른 사람들은 그런 사치를 누릴 수 없습니다.

어쨌든 비슷한 문제가 있는 다른 누군가에게 도움이 되길 바라며 계속해서 이 질문으로 리디렉션되어 스스로에게 "나는 UI에서 아무것도 하고 있지 않다!!"라고 말하는 두통이 얼마나 머리가 아팠는지 모릅니다.

마지막으로 키-값 코딩이 옵션과 함께 작동하지 않는다는 것을 한 번 더 반복합니다. 아래에서 나는 어딘가를 찾았지만 어디에 있는지 잊어버렸습니다. 그래서 이것을 게시한 사람에게 사과하고 내가 이것을 발견한 곳을 기억한다면 크레딧을 줄 것입니다. 하지만 그것이 내 생명을 구했습니다.

KVC는 Cocoa/Objective-C이고 Objective-C는 Optional Int를 볼 수 없기 때문에 Optional Int 속성에 KVC를 사용할 수 없습니다. Objective-C는 Objective-C에 연결된 유형만 볼 수 있습니다.

NSObject에서 파생된 클래스 유형

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

브리지된 Swift 구조체


Community Wiki

"이 클래스는 키에 대한 키 값 코딩이 아닙니다." 조금 늦었다는 것을 알고 있지만 내 대답이 다르기 때문에 게시해야 한다고 생각합니다. 두 번째 컨트롤러를 잘못된 방식으로 밀고 있었습니다. 여기에 샘플이 있습니다.

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

 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];

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


Community Wiki

이름을 바꾸거나 삭제한 Xib Interface의 구성 요소를 참조하는 경우일 수 있습니다. 다시 참조하는 것은 저에게 효과적입니다.


Community Wiki

방금 복제된 프로젝트에서 이 문제가 있었고 2곳을 확인하여 해결했습니다.

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

일부에게는 효과가 있기를 바랍니다.


Community Wiki

내가 찾은 또 다른 "비준수" 문제는 어떤 이유로 클래스의 사본을 두 개 가질 수 있었을 때였습니다.

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

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

이야기의 교훈: 중복된 클래스 파일이 좋지 않습니다.


Community Wiki

이 오류는 다른 것입니다!

다음은 내가 수정한 방법입니다. 저는 xcode 버전 6.1.1을 사용하고 있으며 swift를 사용하고 있습니다. 내 앱이 다음 화면으로 이동하기 위해 segue를 수행하려고 할 때마다 이 오류가 발생했습니다. 여기 내가 한 일.

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

건배,


Community Wiki

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

수정하려면:

  1. .m 파일을 강조 표시합니다.
  2. 오른쪽 창에서 파일 검사기를 선택합니다.
  3. "대상 구성원" 섹션에서 적절한 빌드 대상이 선택되어 있는지 확인하십시오.

이것이 누군가를 돕기를 바랍니다.


Community Wiki

나의 경우에는. 병합 후 xib-files에 누락된 콘센트가 없었습니다.

쉬프트 + 커맨드 + K

내 문제를 해결했습니다. 프로젝트를 정리하고 다시 빌드했습니다.


Community Wiki

문제를 일으키는 IBOutlets가 있는 사용자 지정 UIViewController 하위 클래스가 있는 경우 실제로 오류를 제거하는 단계는 다음과 같습니다.

.1 클래스를 UIViewController로 변경

.2 모든 콘센트를 분리합니다(지금은 모두 노란색 경고 삼각형이 표시됩니다). 문제가 있는 콘센트를 분리하는 것으로 충분할 수 있습니다.

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

.4 앱 실행 - 문제가 있는 장면으로 이동합니다.

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

.6 콘센트를 다시 연결합니다.

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


Community Wiki

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

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

Community Wiki

스토리보드에서 이 오류가 발생했습니다. 위의 솔루션은 문제가 아닌 것 같아서 뷰 컨트롤러를 삭제하고 다시 추가(물론 segue를 다시 연결하고 클래스를 다시 할당)하여 문제를 해결했습니다. 나는 그것이 실제로 무엇인지 모르지만 이것이 시작되기 직전에 관련 뷰 컨트롤러 클래스의 이름을 변경했으므로 아마도 무언가를 호스로 사용했을 것입니다.


Community Wiki

나는 같은 문제가있다. 시뮬레이터를 재설정했습니다. 버튼 컨트롤 제거 및 추가. 그리고 마침내 청소를 했다. :) 스택 오버플로 덕분입니다. 내 코드가 어떻게 괜찮아지고 작동하기 시작했는지 몇 가지.


Community Wiki

출처 : http:www.stackoverflow.com/questions/3088059/xcode-how-to-fix-nsunknownkeyexception-reason-this-class-is-not-key-valu

반응형