另一个这个类不是键值imageView的键值编码兼容

时间:2012-02-26 17:58:17

标签: objective-c xcode key sigabrt

我已经坚持这个问题多年了,我已经浏览了堆栈溢出的答案,但它们似乎没有工作。我尝试删除所有原始连接,然后再次连接它们没有运气。一切都很好,但我收到了这个错误:

*** 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;”

非常感谢帮助。我对目标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

1 个答案:

答案 0 :(得分:6)

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

<强>更新

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

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

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

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