另一个类对于键"imageView"没有进行关键值编码兼容。

3

我已经被这个问题困扰了很久,也在stackoverflow上浏览了答案,但它们似乎都不起作用。我尝试删除所有原始连接,然后重新连接,但没有成功。一切都可以编译,但我收到了这个错误:

*** 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文件中也遇到了"Thread 1 received signal "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 请帮帮我,这个问题已经困扰我几天了。我从头开始重新创建了项目,但没有成功。我已经将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或者故事板,所以我猜你是在代码中创建它的? - jrturton
https://dev59.com/-2445IYBdhLWcg3wmLde - Max
我没有一个名为window.xib的文件,我有一个叫做ViewController.xib的文件,我现在会上传我的ViewController.h和.m文件。 - Cuchullainn
1个回答

6
看起来你正在尝试将你的imageView outlet在XIB中连接到UIApplication而不是你的ViewController。建议从连接它的位置中移除该outlet,然后再尝试。确保右键单击你的视图控制器的XIB的File's Owner并将点从那里的imageView拖到image view对象上。
更新:
看了你发布的项目,我明白你的问题所在。你已经将ViewController设置为你项目设置中的"Main Window XIB"。删除它一切都会好起来。但是,ViewController.xib中也有一个窗口而不是视图。你可以在窗口中拉出视图,然后删除窗口。
如果你对"Main Window XIB"设置感到困惑,那么我将尝试解释一下。启动应用程序的方式有两种:
1. 你将你的应用程序委托类名称作为UIApplicationMain的第四个参数传递。这将实例化一个类,并在applicationDidFinishLaunchingWithOptions:方法期间预计要创建一个窗口,并将其设置为视图控制器的rootViewController并使其关键和可见。 2. 你将类名设置为nil,并设置一个主窗口XIB。这意味着XIB被实例化,并且在其中你需要有你的应用程序委托类实例和一个已设置好的带有根视图控制器的窗口。"File's Owner"将是一个UIApplication实例,你可以在其中将委托输出设置为你在XIB中拥有的应用程序委托对象。然后在applicationDidFinishLaunchingWithOptions:中,你只需要进行关键的操作并使其可见即可。

我在这方面还没有什么好运气,还有其他人有任何其他建议吗?我应该公布didFinishLaunchingWithOptions方法的代码吗? 我真的需要帮助。 - Cuchullainn
你能把整个项目放到某个地方吗? - mattjgalloway
这是一个名为FriendSpotted的项目,链接为http://www.mediafire.com/?ajodezrprtf8j5w。感谢您查看此项目。我完全被卡住了,这让我疯狂。 - Cuchullainn
@Cuchullainn - 我已经添加了一个更新来解决你的问题。如果有任何问题,请告诉我。 (抱歉晚了一些,因为此时是GMT的晚上:-)) - mattjgalloway
当我按照我解释的步骤操作时,它对我没有起作用。你具体采取了哪些步骤,从你发布的项目到现在的状态?(或者在其他地方发布一个更新后的版本:-)) - mattjgalloway
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接