NSUnknownKeyException setValue:forUndefineKey로 인해 iPhone 앱이 충돌함:[복제하다]

StackOverflow https://stackoverflow.com/questions/46220

  •  09-06-2019
  •  | 
  •  

문제

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

다음 오류가 발생합니다.

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이 무엇을 의미하는지 또는 클래스가 키에 대한 키 값 코딩 규격이 아닌 이유가 무엇인지 잘 모르겠습니다.

도움이 되었습니까?

해결책

(이것은 실제로 iPhone에만 해당되는 것은 아닙니다. 일반 Cocoa에서도 동일한 일이 발생합니다.)

NSUnknownKeyException은 다음을 사용할 때 발생하는 일반적인 오류입니다. 키-값 코딩 객체에 없는 키에 액세스합니다.

대부분의 Cocoa 객체의 속성은 다음과 같이 직접 액세스할 수 있습니다.

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

또는 키-값 코딩을 통해:

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

다음 줄을 사용하면 NSUnknownKeyException이 발생합니다.

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

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

코드의 어떤 부분이 UIView의 'kramerImage' 키에 대한 값을 설정하려고 시도하고 있는데, 이는 (분명히) 해당 키를 지원하지 않습니다.Interface Builder를 사용하고 있다면 펜촉에 뭔가가 있을 수 있습니다.

'kramerImage'가 사용되는 위치를 찾아 거기에서 추적해 보세요.

다른 팁

또한 뷰 이름을 바꿀 때 파일 소유자에 대한 참조를 삭제하는 것을 잊지 마세요.이 오류가 발생할 수도 있습니다.

이 오류가 발생하는 위치와 해결 방법은 다음과 같습니다.맞춤형 TableViewCell이 있는 펜촉을 로드할 때 이 오류가 발생했습니다.저는 IB를 사용하여 파일 소유자, 최초 응답자 및 TableViewCell만 있는 xib를 구축했습니다.TableViewCell에는 rootCell이라는 4개의 IBOutlet UILabel이 있는 클래스와 일치하는 4개의 UILabel이 있습니다.TableViewCell의 클래스를 rootCell로 변경했습니다.몇 가지 변경을 하기 전까지는 잘 작동했는데 갑자기 setValue:forUndefineKey가 표시되었습니다.펜촉에서 클래스를 로드한 후 클래스를 인스턴스화했을 때:

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

    cell = [nib objectAtIndex:0];

펜촉을 로드하려고 할 때 첫 번째 줄에서 실패했습니다.잠시 후 IBOutlet 레이블을 rootCell 클래스가 아닌 루트 컨트롤러에 일치시키려고 한다는 것을 알았습니다!그게 내 팁이었습니다.내가 잘못한 것은 실수로 파일 소유자를 rootCell 클래스로 변경한 것입니다.NSObject로 다시 변경했을 때 로드 시 대리자(rootController)와 일치하려고 시도하지 않았습니다.따라서 위 작업을 수행하는 경우 File's Owner를 NSObject로 만들고 UITableCell을 원하는 클래스로 만듭니다.

이런 상황이 발생했는데 변수의 모든 인스턴스를 찾아 삭제한 후에도 내 앱이 여전히 충돌하는 것으로 나타났습니다.무슨 일이 있었나요?XIB의 텍스트 필드에서 viewController.h로 변수의 또 다른 인스턴스를 생성했지만 더 이상 필요하지 않다는 것을 깨닫고 삭제했습니다.내 프로그램이 그것을 보고 프로그램에서 계속 사용하려고 시도한 것으로 나타났습니다. 따라서 나중에 다른 곳에서 이런 일이 발생하면 XIB로 이동하여 버튼이나 텍스트 필드 등을 마우스 오른쪽 버튼으로 클릭하고 사용되지 않는 추가 변수를 삭제하십시오.

오늘도 같은 문제가 발생했습니다.내 Navigation Controller의 View Controller에 대해 올바른 클래스가 지정되지 않았습니다.이는 Interface Builder에서 뷰에 대한 올바른 클래스를 지정하지 못한 경우 자주 발생합니다.

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

이것이 내가 해결한 방법입니다. 인터페이스 빌더에서 View Controller를 마우스 오른쪽 버튼으로 클릭하면 누락된 콘센트 또는 작업 메서드에 느낌표가 있어야 합니다.모든 참조를 찾아 제거하면 문제가 해결됩니다.

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

하고 있는 것 같네요

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

그런 다음 해당 이미지 보기를 합성한 후 Interface Builder에서 "MyFirstIphoneAppViewController.xib"를 열면 해당 콘센트를 "MyFirstIphoneAppViewController.xib"의 파일 소유자의 'InitialkramerImage'에 연결하는 도구(메뉴)/라이브러리에서 이미지 보기를 가져옵니다. .그런 다음 프로젝트를 저장했습니다.그러나 그 후에는 콘센트 변수 "InitialkramerImage"의 이름을 "kramerImage"로 변경할 수 있습니다.그래서 이 일을 하고 나면

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

프로젝트를 실행하면 "MyFirstIphoneAppViewController.xib"에 "InitialkramerImage" 아웃렛이 존재하지 않습니다.따라서 프로젝트를 실행할 때 Imageview에서 'kramerImage'를 참조하는 콘센트가 없으며

"보기를 표시하기 위해 UIViewController는 존재하지 않는"InitialKramerimage "의 콘센트를 찾으려고합니다."

따라서 "NSUnknownKeyException"이 발생합니다.

NIB (.xib) 파일을 열어 누락 된 아울렛을 확인한 다음 해당 '파일 소유자'를 마우스 오른쪽 버튼으로 클릭하십시오.

이 코드를 다른 곳에서 수행했고 zip/압축 파일이 있는 경우 다시 추출해 보세요.작동할 수도 있습니다. 이유는 모르겠지만 추출 문제인 것 같습니다.

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top