【问题标题】:another this class is not key value coding-compliant for the key imageView [duplicate]另一个此类与键 imageView [重复] 的键值编码不兼容
【发布时间】:2025-11-26 23:40:02
【问题描述】:

我多年来一直被这个问题困扰,我浏览了有关堆栈溢出的答案,但它们似乎不起作用。我尝试删除所有原始连接,然后再次连接它们,但没有成功。一切编译正常,但我收到此错误:

*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason:   '[<UIApplication 0x6a067d0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key imageView.'
*** First throw call stack:
(0x11e4052 0x1375d0a 0x11e3f11 0xa4c032 0x9bdf7b 0x9bdeeb 0x9d8d60 0x2cb91a 0x11e5e1a 0x114f821 0x2ca46e 0x2cc010 0xac14a 0xac461 0xab7c0 0xba743 0xbb1f8 0xaeaa9 0x1c84fa9 0x11b81c5 0x111d022 0x111b90a 0x111adb4 0x111accb 0xab2a7 0xaca9b 0x2072 0x1fe5)
terminate called throwing an exception

我还在我的 main.m 中收到“线程 1 收到信号”SIGABRT 消息

0x000ac97f  <+0891>  mov    %eax,(%esp)
0x000ac982  <+0894>  call   0x5478b2 <dyld_stub_objc_msgSend>
0x000ac987  <+0899>  mov    %eax,%esi
0x000ac989  <+0901>  mov    0x69940e(%edi),%eax
0x000ac98f  <+0907>  mov    0x68db46(%edi),%ecx
0x000ac995  <+0913>  lea    0x525009(%edi),%edx
0x000ac99b  <+0919>  mov    %edx,0x8(%esp)
0x000ac99f  <+0923>  mov    %ecx,0x4(%esp)
0x000ac9a3  <+0927>  mov    %eax,(%esp)
0x000ac9a6  <+0930>  call   0x5478b2 <dyld_stub_objc_msgSend>
0x000ac9ab  <+0935>  mov    0x68df86(%edi),%ecx
0x000ac9b1  <+0941>  mov    %ebx,0x18(%esp)
0x000ac9b5  <+0945>  lea    0x6a6c56(%edi),%edx
0x000ac9bb  <+0951>  mov    %edx,0x14(%esp)
0x000ac9bf  <+0955>  mov    %eax,0xc(%esp)
0x000ac9c3  <+0959>  mov    %esi,0x8(%esp)
0x000ac9c7  <+0963>  mov    %ecx,0x4(%esp)
0x000ac9cb  <+0967>  mov    -0x18(%ebp),%eax
0x000ac9ce  <+0970>  mov    %eax,(%esp)
0x000ac9d1  <+0973>  movl   $0x641,0x10(%esp)
0x000ac9d9  <+0981>  call   0x5478b2 <dyld_stub_objc_msgSend>
0x000ac9de  <+0986>  mov    0x699476(%edi),%eax
0x000ac9e4  <+0992>  mov    0x68db72(%edi),%ecx
0x000ac9ea  <+0998>  mov    %ecx,0x4(%esp)
0x000ac9ee  <+1002>  mov    %eax,(%esp)
0x000ac9f1  <+1005>  call   0x5478b2 <dyld_stub_objc_msgSend>
0x000ac9f6  <+1010>  mov    0x68df92(%edi),%ecx
0x000ac9fc  <+1016>  mov    %eax,0x8(%esp)
0x000aca00  <+1020>  mov    %ecx,0x4(%esp)
0x000aca04  <+1024>  mov    -0x10(%ebp),%esi
0x000aca07  <+1027>  mov    %esi,(%esp)
0x000aca0a  <+1030>  call   0x5478b2 <dyld_stub_objc_msgSend>
0x000aca0f  <+1035>  mov    0x6d0fbe(%edi),%ebx
0x000aca15  <+1041>  test   %al,%al
0x000aca17  <+1043>  je     0xaca2c <UIApplicationMain+1064>
0x000aca19  <+1045>  mov    0x68dbb6(%edi),%eax
0x000aca1f  <+1051>  mov    %ebx,0x8(%esp)
0x000aca23  <+1055>  mov    %eax,0x4(%esp)
0x000aca27  <+1059>  mov    %ebx,(%esp)
0x000aca2a  <+1062>  jmp    0xaca69 <UIApplicationMain+1125>
0x000aca2c  <+1064>  mov    0x68dc0a(%edi),%eax
0x000aca32  <+1070>  mov    %eax,0x4(%esp)
0x000aca36  <+1074>  mov    %esi,(%esp)
0x000aca39  <+1077>  call   0x5478b2 <dyld_stub_objc_msgSend>
0x000aca3e  <+1082>  mov    0x68dcba(%edi),%ecx
0x000aca44  <+1088>  mov    %ecx,0x4(%esp)
0x000aca48  <+1092>  mov    %eax,(%esp)
0x000aca4b  <+1095>  call   0x5478b2 <dyld_stub_objc_msgSend>
0x000aca50  <+1100>  mov    0x68df96(%edi),%ecx
0x000aca56  <+1106>  mov    %eax,0x8(%esp)
0x000aca5a  <+1110>  mov    %ecx,0x4(%esp)
0x000aca5e  <+1114>  mov    %ebx,(%esp)
0x000aca61  <+1117>  movl   $0x1,0xc(%esp)
0x000aca69  <+1125>  call   0x5478b2 <dyld_stub_objc_msgSend>
0x000aca6e  <+1130>  mov    0x68db22(%edi),%eax
0x000aca74  <+1136>  mov    %eax,0x4(%esp)
0x000aca78  <+1140>  mov    -0x14(%ebp),%eax
0x000aca7b  <+1143>  mov    %eax,(%esp)
0x000aca7e  <+1146>  call   0x5478b2 <dyld_stub_objc_msgSend>
0x000aca83  <+1151>  mov    0x6d0fbe(%edi),%eax
0x000aca89  <+1157>  mov    0x68df9a(%edi),%ecx
0x000aca8f  <+1163>  mov    %ecx,0x4(%esp)
0x000aca93  <+1167>  mov    %eax,(%esp)
0x000aca96  <+1170>  call   0x5478b2 <dyld_stub_objc_msgSend>
0x000aca9b  <+1175>  xor    %eax,%eax
0x000aca9d  <+1177>  add    $0x2c,%esp
0x000acaa0  <+1180>  pop    %esi
0x000acaa1  <+1181>  pop    %edi
0x000acaa2  <+1182>  pop    %ebx
0x000acaa3  <+1183>  pop    %ebp
0x000acaa4  <+1184>  ret

这是我的 xib 的图片,文件所有者自定义类设置为 ViewController 应该是这样。

http://i.imgur.com/aqFo9.png

我真的需要帮助,这已经发生了几天。我从头开始重新制作了这个项目,但没有运气。如果需要,我可以提供我的 ViewController.h 和 ViewController.m 代码。我将 imageView 声明为“@property (nonatomic, retain) IBOutlet UIImageView *imageView;”

我们将不胜感激。我对使用 Objective C 和 Xcode 编程还是很陌生。

这里是 ViewController.h:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UIImagePickerControllerDelegate,   UINavigationControllerDelegate>

{

BOOL newMedia;

}

@property (nonatomic, retain) IBOutlet UIImageView *imageView;

- (IBAction) useCamera;
- (IBAction) useCameraRoll;

@end

这里是 ViewController.m:

#import "ViewController.h"
#import "MobileCoreServices/UTCoreTypes.h"

@implementation ViewController

@synthesize imageView;

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}

- (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}

- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
}

- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
}

- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
}

- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
}

- (BOOL)shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
} else {
    return YES;
}
}

-(void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info
{
NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];

[self dismissModalViewControllerAnimated:YES];

if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) {
    UIImage *image = [info 
                      objectForKey:UIImagePickerControllerOriginalImage];

    imageView.image = image;

    if (newMedia)
        UIImageWriteToSavedPhotosAlbum(image, 
                                       self,
                                         @selector(image:finishedSavingWithError:contextInfo:),
                                       nil);
}
else if ([mediaType isEqualToString:(NSString *)kUTTypeMovie])
{
    // Code here to support video if enabled
}
}

-(void)image:(UIImage *)image
finishedSavingWithError:(NSError *)error 
 contextInfo:(void *)contextInfo
{
if (error) {
    UIAlertView *alert = [[UIAlertView alloc]
                          initWithTitle: @"Save failed"
                          message: @"Failed to save image"
                          delegate: nil
                          cancelButtonTitle:@"OK"
                          otherButtonTitles:nil];
    [alert show];
    [alert release];
}
}


-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
[self dismissModalViewControllerAnimated:YES];
}

- (IBAction) useCamera

{
if ([UIImagePickerController isSourceTypeAvailable:
     UIImagePickerControllerSourceTypeCamera])
{
    NSLog(@"you reached here for camera");

    UIImagePickerController *imagePicker =
    [[UIImagePickerController alloc] init];
    imagePicker.delegate = self;
    imagePicker.sourceType = 
    UIImagePickerControllerSourceTypeCamera;
    imagePicker.mediaTypes = [NSArray arrayWithObjects:
                              (NSString *) kUTTypeImage,
                              nil];
    imagePicker.allowsEditing = NO;
    [self presentModalViewController:imagePicker animated:YES];
    [imagePicker release];
    newMedia = YES;
}



}


- (IBAction) useCameraRoll

{
    if ([UIImagePickerController isSourceTypeAvailable:
         UIImagePickerControllerSourceTypeSavedPhotosAlbum])
{
    NSLog(@"you reached here for camera roll");

    UIImagePickerController *imagePicker =
    [[UIImagePickerController alloc] init];
    imagePicker.delegate = self;
    imagePicker.sourceType = 
    UIImagePickerControllerSourceTypePhotoLibrary;
    imagePicker.mediaTypes = [NSArray arrayWithObjects:
                              (NSString *) kUTTypeImage,
                              nil];
    imagePicker.allowsEditing = NO;
    [self presentModalViewController:imagePicker animated:YES];
    [imagePicker release];
    newMedia = NO;
}

}






@end

【问题讨论】:

  • 你能在你实际创建这个视图控制器的地方包含代码吗?您似乎没有主窗口 xib 或情节提要,所以我猜您是用代码创建的?
  • 我没有window.xib,我有一个叫ViewController.xib的,我现在把我的ViewController.h和.m放上来。

标签: objective-c xcode key sigabrt


【解决方案1】:

您似乎正在尝试将您的一个 XIB 中的 imageView 插座连接到 UIApplication 而不是您的 ViewController。我建议从你连接的地方移除插座,然后再试一次。确保您右键单击视图控制器的 XIB 的文件所有者,然后将点从那里的 imageView 拖动到图像视图对象。

更新:

查看了您发布的项目,我明白您的问题是什么。您已在项目设置中将 ViewController 设置为“主窗口 XIB”。删除它,一切都很好。但是,您在ViewController.xib 中也有一个窗口,而不是一个视图。您在该窗口中有一个视图,因此只需从该窗口中拉出视图并删除该窗口。

如果您对“主窗口 XIB”设置感到困惑,那么我将尝试解释一下。应用启动的方式是以下两种方式之一:

  1. 您将应用委托的类名称作为第四个参数传递给UIApplicationMain。这会实例化一个,然后在 applicationDidFinishLaunchingWithOptions: 方法期间,您应该创建一个窗口,将一个视图控制器设置为其 rootViewController 并使其成为键和可见。

  2. 您将 nil 作为 UIApplicationMain 中的类的名称传递,并设置主窗口 XIB。这意味着 XIB 被实例化,并且在其中你应该有一个你的应用程序委托的实例和一个带有根视图控制器的窗口。 “文件的所有者”将是一个 UIApplication 实例,您可以将其中的委托出口设置为您在 XIB 中拥有的应用程序委托对象。然后在applicationDidFinishLaunchingWithOptions: 中,您只需要执行生成密钥和可见步骤即可。

【讨论】:

  • 我的“图像视图”(参见 imgur 链接,它的自定义类是 UIImageView,但它没有为我的 ViewController 类提供选项。我将它链接到文件所有者,它确实有它的类设置为 ViewController。我已经完成了 File Owner 和 Image View 之间的连接,给了我一个类似的出口:imageView ---------- Image View
  • 在这方面仍然没有运气,还有其他人有什么建议吗?我应该为 didFinishLaunchingWithOptions 方法提供代码吗?我真的需要关于 thid=s 的帮助。
  • 你能把整个项目放在某个地方吗?
  • mediafire.com/?ajodezrprtf8j5w 这是一个名为 FriendSpotted 的项目,感谢您的关注。完全被难住了,我被它逼疯了。
  • @Cuchullainn - 我添加了一个更新来解决您的问题。让我知道任何问题。 (为延迟道歉 - 这是格林威治标准时间的夜间 :-))
最近更新 更多