2008-09-05 14 views
18

첫 번째 iPhone 앱을 작성 중이므로 디버깅 방법을 많이 알지 못했습니다. 기본적으로 내 앱에 이미지가 표시되며 터치하면 짧은 소리가납니다. XCode에서 프로젝트를 컴파일하고 빌드하면 모든 것이 성공적으로 빌드되지만 iPhone 시뮬레이터에서 앱을 실행하면 충돌이 발생합니다.NSUnknownKeyException으로 iPhone 응용 프로그램이 충돌합니다. setValue : forUndefinedKey :

나는 다음과 같은 오류가 발생합니다 : 여기

Application Specific Information: 
iPhone Simulator 1.0 (70), iPhone OS 2.0 (5A331) 
*** Terminating app due to uncaught exception 'NSUnknownKeyException', 
reason: '[<UIView 0x34efd0> setValue:forUndefinedKey:]: this class is not key value 
coding-compliant for the key kramerImage.' 

kramerImage 내가 백그라운드에서 사용하고 이미지입니다.

NSUnknownKeyException이 의미하는 바가 무엇인지, 또는 클래스가 키의 코드 값을 코딩하는 키 값이 아닌지 확실하지 않습니다.

답변

22

(이것은 iPhone에만 해당되는 것이 아니며 일반 코코아에서도 마찬가지입니다).

NSUnknownKeyException은 Key-Value Coding을 사용하여 객체에없는 키에 액세스 할 때 자주 발생하는 오류입니다. 대부분의 코코아 개체의

특성은 직접 액세스 할 수 있습니다 : 나는 다음 줄을 사용하면 내가 NSUnknownKeyException을 얻을 것

[@"hello world" valueForKey:@"length"] 

:

[@"hello world" length] // Objective-C 1.0 
@"hello world".length  // Objective-C 2.0 

또는 키 - 값 코딩을 통해

[@"hello world" valueForKey:@"purpleMonkeyDishwasher"] 

NSString에는 'purpleMonkeyDishwasher'라는 속성 (키)이 없기 때문에

코드에서 뭔가 (분명히) 해당 키를 지원하지 않는 UIView에서 'kramerImage'키의 값을 설정하려고합니다. Interface Builder를 사용하고 있다면, 펜촉에 뭔가있을 수 있습니다.

어디에서 'kramerImage'가 사용되고 있는지 찾아서 거기에서 추적 해보십시오.

+2

이 오류가 발생하며 interfacebuilder와 관련이 있습니다. 그러나 문제를 해결하는 방법을 생각할 수 없습니다. – bentford

+1

그 덕분에 또 다른 3 시간을 마침내 고쳤습니다. :) –

+0

한 프로젝트에서 다른 프로젝트로 파일을 복사 한 상황에서이 문제가 발생했습니다. 내 xib이 잘못된 클래스 이름을 나타 냈습니다. 이 대답은 유레카 순간에 대한 충분한 정보를주었습니다. 감사합니다. – Grumdrig

10

또한보기의 이름을 변경할 때 File Owner에서 참조를 삭제하는 것을 잊지 마십시오. 또한이 오류가 발생할 수 있습니다.

+1

+1 이것은 나에게 일어났다. . 내 MKMapView 및 갑자기 BAM에 대한 변수의 이름을 변경했습니다. NSUknownUknownKeyException. – ladookie

+0

Storyboard에는 KeyValue 오류의 원인이 된 아무 것도없는 링크 된 단추가있었습니다. 이것은 내 문제를 해결했다. 감사! –

8

이 오류가 발생하는 곳과 문제를 해결하는 방법은 다음과 같습니다. 방금 사용자 정의 TableViewCell을 가진 펜촉을로드 할 때 가져 왔습니다. 필자는 IB를 사용하여 파일 소유자, 첫 번째 응답자 및 TableViewCell 만있는 xib를 작성했습니다. TableViewCell은 방금 4 개의 UILabels를 가졌습니다.이 테이블은 rootCell이라는 4 개의 IBOutlet UILabels가있는 클래스까지 일치했습니다. TableCell의 클래스를 rootCell로 변경했습니다. forUndefinedKey : A는 변화의 몇 가지를 만들어 갑자기 나는 setValue의를 얻고 있었다 때까지 괜찮 았는데 난 그냥 코코아 콩을로드 한 후 클래스를 인스턴스화 할 때 :

NSArray * nib = [[NSBundle mainBundle] loadNibNamed:@"rootCell-iPad" owner:self options:nil]; 

    cell = [nib objectAtIndex:0]; 

그것은 첫 번째 줄에 실패 할 때 펜촉이 적재하려고했습니다. 잠시 후, 나는 그것이 IBOutlet Labels를 root 컨트롤러가 아닌 root 컨트롤러와 일치 시키려고한다는 것을 알았습니다! 그것은 나의 조언이었다. 내가 잘못한 것은 실수로 File 's Owner를 rootCell 클래스로 변경하는 것이 었습니다. 다시 NSObject로 변경했을 때로드 할 때 대리자 (rootController)와 일치 시키려고하지 않았습니다. 그래서, 위의 경우 FileObject Owner를 NSObject로 만들고 UITableCell을 원하는 클래스로 만듭니다.당신이 인터페이스 빌더에서 "MyFirstIphoneAppViewController.xib"를 열 때

+0

+1 그리고 나 자신과 다른 사람에게 잊지 말아야 할 것 : loadNibNamed : owner : options :를 사용할 때, File 's Owner는 NSObject 여야하고 메인 뷰는 클래스 유형이어야하며 모든 아웃렛은 뷰에 연결되어야합니다 , _not_ 파일 소유자. – Echelon

+0

감사합니다. Owen, 나는 똑같은 상황으로 어려움을 겪었습니다. 설명 된대로 해결됩니다. 고마워요! – Khiet

0

당신이 도구 (메뉴)에서 이미지보기를 복용/라이브러리 덴 연결을 해당 이미지 뷰를 합성 한 후 다음

@interface MyFirstIphoneAppViewController : UIViewController<> { 
    UIImageView *InitialkramerImage; 
} 
@property(nonatomic,retain) IBOutlet UIImageView *InitialkramerImage; 

을하고 있습니다 보인다 "MyFirstIphoneAppViewController.xib"의 파일 소유자에서 'InitialkramerImage'로 출력합니다. 그런 다음 프로젝트를 저장했습니다. 그러나 그 후에 콘센트 변수 "InitialkramerImage"의 이름을 "kramerImage"로 변경할 수 있습니다. 그래서,이

@interface MyFirstIphoneAppViewController : UIViewController<> { 
    UIImageView *kramerImage; 
} 
@property(nonatomic,retain) IBOutlet UIImageView *kramerImage; 

을하고 당신이 그것을 실행 프로젝트를 저장 한 후, "MyFirstIphoneAppViewController.xib"에서 "InitialkramerImage"의 출구없는 실존 없습니다. 프로젝트를 실행할 때 그래서, 'kramerImage'와

"For displaying the view, UIViewController will try to find the outlet to "InitialkramerImage" which is not existing."

그래서, 그것은 "NSUnknownKeyException"를 던질 것이다에 이미지 뷰에서 참조하는 어떤 출구가 없을 것입니다.

You can check the missing outlet by opening the nib(.xib) file then right clicking on the 'Files Owner' of that.

2

오늘도 이와 같은 문제가있었습니다. 내 탐색 컨트롤러에서 View Controller에 대해 올바른 클래스를 지정하지 않았습니다. Interface Builder에서 뷰에 대한 올바른 클래스를 지정하지 않으면이 작업이 자주 발생합니다.

잘못된 선택기 문제도 발생합니다. Interface Builder 클래스와 연결을 항상 확인하십시오!

+0

감사합니다. IB에서 올바르게 클래스를 지정했지만 initWithNibName에 지정된 컨트롤러와 펜촉 사이에 불일치가있었습니다. - 내 사본 + 붙여 넣기 권한을 취소해야합니다. – masty

+0

iOS 도장으로 돌아가서 복사본 + 붙여 넣기 - 연습을 연습 해보십시오. – gonzobrains

0

다른 곳에서이 코드를 수행하고 압축/압축 파일이있는 경우 다시 압축을 풀어보십시오. 그것은 이유를 모르지만 나는 추출 문제라고 느낄 수 있습니다.

또는 IBOutlet을 kramerImage로 변경하고 NIB에서 다시 바인딩 할 수 있습니다.

2

나는이 상황을 겪었고 변수의 모든 인스턴스를 찾아내어 삭제 한 후에도 여전히 내 응용 프로그램이 손상되었습니다. 무슨 일이 있었는지 Heres ... 나는 내 viewController.h 내 XIB에서 텍스트 필드에서 변수의 또 다른 인스턴스를 만들었지 만, 내가 더 이상 필요 없어 그것을 삭제하고 그것을 깨달았다. 내 프로그램을 보니 프로그램에서 사용하려고 했으니 나중에 다른 곳으로 가버린다면 XIB를 버튼이나 텍스트 필드에서 오른쪽 버튼으로 클릭하고 사용하지 않는 여분의 변수를 삭제하십시오.

2

이것은 인터페이스 작성기에서 View Controller를 마우스 오른쪽 단추로 클릭하고 누락 된 콘센트 또는 동작 방법에 느낌표가 있어야합니다. 찾기 및 모든 참조를 제거하고 그것을 해결.

이것은 .m 파일에서 작업 메서드를 삭제했기 때문에 발생했습니다.

관련 문제