iosobjective-cnsunknownkeyexception

NSUnknownKeyException ios Objective C


I have created a Slide drawer for my ios app.. The slide drawer working perfectly... I have a few buttons and a Textbox in the Slide drawer... The problem is whenever i try to add reference to the button/textbox which is in the slide drawer, i am getting NSUnknownKeyException... I dont know how to solve the issue, since am very new in IOs... Am including the code below...

SlideDrawer.h

#import <UIKit/UIKit.h>

@interface SlideDrawer : UIViewController
@property (strong, nonatomic) IBOutlet UIButton *home;
- (IBAction)homeclick:(id)sender;
@end

SlideDrawer.m

#import "SlideDrawer.h"
@interface SlideDrawer ()
@end
@implementation SlideDrawer
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
}

- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
 - (IBAction)homeclick:(id)sender {
}
@end

MainViewController.h

#import <UIKit/UIKit.h>

@interface mainViewController : UIViewController{
UIView *menuDrawer;
}

@property (readonly, nonatomic) UISwipeGestureRecognizer     *recognizer_open, *recognizer_close;
@property (readonly, nonatomic) int menuDrawerX, menuDrawerWidth;

-(void) handleSwipes:(UIGestureRecognizer *) sender;
-(void) drawerAnimation;

@end

MainViewController.m

#import "mainViewController.h"

@interface mainViewController ()

@end

@implementation mainViewController

@synthesize menuDrawerWidth, menuDrawerX,recognizer_open, recognizer_close;

 - (void)viewDidLoad {
    [super viewDidLoad];
    menuDrawer = [[[NSBundle mainBundle] loadNibNamed:@"SlideDrawer" owner:self options:nil]objectAtIndex:0];
    menuDrawer.backgroundColor= [UIColor colorWithRed:0.18 green:0.09 blue:0.29 alpha:1.0];
    menuDrawerWidth= self.view.frame.size.width * 0.80;
    int statusbarHeight= [UIApplication sharedApplication].statusBarFrame.size.height;
    menuDrawerX= self.view.frame.origin.x- menuDrawerWidth;
    menuDrawer.frame= CGRectMake(menuDrawerX,  menuDrawer.frame.origin.y+statusbarHeight, menuDrawerWidth, self.view.frame.size.height-statusbarHeight);
    // menuDrawer.backgroundColor=[UIColor colorWithRed:0.18 green:0.09 blue:0.29 alpha:1.0];
    recognizer_close= [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipes:)];
    recognizer_open= [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipes:)];
    recognizer_close.direction= UISwipeGestureRecognizerDirectionLeft;
    recognizer_open.direction= UISwipeGestureRecognizerDirectionRight;
    [self.view addGestureRecognizer:recognizer_open];
    [self.view addGestureRecognizer:recognizer_close];
    [self.view addSubview:menuDrawer];
}

- (void)didReceiveMemoryWarning {
     [super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
 }

 -(void) handleSwipes:(UIGestureRecognizer *) swipe{
     [self drawerAnimation];

}
-(void) drawerAnimation{
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDuration:-10];
    CGFloat new_x = 0;
    if(menuDrawer.frame.origin.x<self.view.frame.origin.x)
    {
        new_x= menuDrawer.frame.origin.x+menuDrawerWidth;
        UIBezierPath *shadowPath = [UIBezierPath bezierPathWithRect:menuDrawer.bounds];
        menuDrawer.layer.masksToBounds = NO;
        menuDrawer.layer.shadowColor = [UIColor blackColor].CGColor;
        menuDrawer.layer.shadowOffset = CGSizeMake(0.0f, 1.0f);
        menuDrawer.layer.shadowOpacity = 0.5f;
        menuDrawer.layer.shadowPath = shadowPath.CGPath;
        [self.view removeGestureRecognizer:recognizer_open];
        [self.view addGestureRecognizer:recognizer_close];
    }
    else{
        new_x= menuDrawer.frame.origin.x-menuDrawerWidth;
        UIBezierPath *shadowPath = [UIBezierPath bezierPathWithRect:menuDrawer.bounds];
        menuDrawer.layer.masksToBounds = NO;
        menuDrawer.layer.shadowColor = [UIColor blackColor].CGColor;
        menuDrawer.layer.shadowOffset = CGSizeMake(0.0f, 1.0f);
        menuDrawer.layer.shadowOpacity = 0.0f;
        menuDrawer.layer.shadowPath = shadowPath.CGPath;
        [self.view removeGestureRecognizer:recognizer_close];
        [self.view addGestureRecognizer:recognizer_open];
    } 
    menuDrawer.frame= CGRectMake(new_x, menuDrawer.frame.origin.y, menuDrawer.frame.size.width, menuDrawer.frame.size.height);
    [UIView commitAnimations];
 } 
 @end

EDIT

Exception is the line in main.m

 return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));

Exception

2015-06-10 14:07:17.357 Xpressions[5939:1056267] Unknown class ViewController in Interface Builder file. 2015-06-10 14:07:17.367

Xpressions[5939:1056267] * Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[ setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key home.' * First throw call stack: ( 0 CoreFoundation 0x0089e746 exceptionPreprocess + 182 1 libobjc.A.dylib
0x00527a97 objc_exception_throw + 44 2 CoreFoundation
0x0089e361 -[NSException raise] + 17 3 Foundation
0x001a81ee -[NSObject(NSKeyValueCoding) setValue:forUndefinedKey:] + 282 4 Foundation 0x00105608 _NSSetUsingKeyValueSetter + 115 5 Foundation 0x0010558d -[NSObject(NSKeyValueCoding) setValue:forKey:] + 267 6
Foundation 0x0013b016 -[NSObject(NSKeyValueCoding) setValue:forKeyPath:] + 386 7 UIKit 0x00fa8672 -[UIRuntimeOutletConnection connect] + 106 8
libobjc.A.dylib 0x0053d724 -[NSObject performSelector:] + 62 9 CoreFoundation
0x007d647c -[NSArray makeObjectsPerformSelector:] + 316 10 UIKit
0x00fa7133 -[UINib instantiateWithOwner:options:] + 1775 11 UIKit
0x00fa8fd2 -[NSBundle(UINSBundleAdditions) loadNibNamed:owner:options:] + 180 12 Xpressions
0x000418cf -[mainViewController viewDidLoad] + 175 13 UIKit
0x00dc1da4 -[UIViewController loadViewIfRequired] + 771 14 UIKit
0x00dc2095 -[UIViewController view] + 35 15 UIKit
0x00cb3e85 -[UIWindow addRootViewControllerViewIfPossible] + 66 16 UIKit 0x00cb434c -[UIWindow _setHidden:forced:] + 287 17 UIKit 0x00cb4648 -[UIWindow _orderFrontWithoutMakingKey] + 49 18 UIKit
0x00cc29b6 -[UIWindow makeKeyAndVisible] + 80 19 Xpressions
0x00043534 -[AppDelegate application:didFinishLaunchingWithOptions:] + 580 20 UIKit 0x00c56fd7 -[UIApplication _handleDelegateCallbacksWithOptions:isSuspended:restoreState:] + 287 21 UIKit 0x00c57dc1 -[UIApplication _callInitializationDelegatesForMainScene:transitionContext:] + 2938 22 UIKit 0x00c5b422 -[UIApplication _runWithMainScene:transitionContext:completion:] + 1639 23 UIKit 0x00c7493e __84-[UIApplication _handleApplicationActivationWithScene:transitionContext:completion:]_block_invoke + 59 24 UIKit 0x00c5a04a -[UIApplication workspaceDidEndTransaction:] + 155 25 FrontBoardServices 0x03200c9e __37-[FBSWorkspace clientEndTransaction:]_block_invoke_2 + 71 26 FrontBoardServices
0x0320072f __40-[FBSWorkspace _performDelegateCallOut:]_block_invoke + 54 27 FrontBoardServices 0x03212d7c __31-[FBSSerialQueue performAsync:]_block_invoke_2 + 30 28 CoreFoundation 0x007c0050 __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK
+ 16 29 CoreFoundation 0x007b5963 __CFRunLoopDoBlocks + 195 30 CoreFoundation
0x007b57bb __CFRunLoopRun + 2715 31 CoreFoundation
0x007b4a5b CFRunLoopRunSpecific + 443 32 CoreFoundation
0x007b488b CFRunLoopRunInMode + 123 33 UIKit
0x00c59a02 -[UIApplication _run] + 571 34 UIKit
0x00c5d106 UIApplicationMain + 1526 35 Xpressions
0x00043a0a main + 138 36 libdyld.dylib
0x02c2aac9 start + 1 ) libc++abi.dylib: terminating with uncaught exception of type NSException


Solution

  • There are two possible reasons for this:

    Easy one, you have connection, deleted element but link between outlet and the code remained, and is now pointing to empty. This one you can check in the last tab on the right side in the interface builder.

    The other one: you have connected your outlet to File owner instead to the class. Remove your outlets and connect them to the class instead. when you connect your outlets(from code to the element, you will have empty circle) you will get the popup for the selection : file owner - class.

    Edit :

    Remove outlets by pressing the x and then reconnect again from the code. When you remove these outlets, you will have empty circles in the .h class and reconnect again to SlideDrawer.

    enter image description here