Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting "unrecognized selector sent to instance" For UIView

I have tried to cast an implementation of my UIView class to my view controller. However, when try to call a method for my class it throws "unrecognized selector sent to instance".

Here is what I am doing in my header file:

#import <UIKit/UIKit.h>

@interface GameViewController : UIViewController{

    NSTimer *gameLoop;

}

- (IBAction)quitGame:(id)sender;
- (IBAction)rotateLeft:(id)sender;
- (IBAction)rotateRight:(id)sender;
- (IBAction)thrust:(id)sender;


@end

typedef enum { NOTREADY, READY, RUNNING, WON, LOST, PAUSED } GameState; 
typedef enum { EASY, MEDIUM, HARD } GameDifficulty; 
typedef enum { THRUSTERS_ON, THRUSTERS_OFF } ThrusterState; 

// Declaration of other constants used to manage the physics 
static const int FUEL_INITIAL = 200; 
static const int FUEL_MAX = 200; 
static const int FUEL_BURN = 10; 
static const int MAX_INIT = 30; 
static const int MAX_SPEED = 120; 
static const int ACCELERATION_DOWN = 35; 
static const int ACCELERATION_UP = 80; 
static const double GRAVITY = 9.8; 

@interface GameView : UIView { 
@private UIImage            *plander_thrust; 
@private UIImage            *plander_nothrust; 
@private UIImage            *plander_crashed; 

    // Other game member variables 
@private GameState          gstate; 
@private GameDifficulty     level; 
@private ThrusterState      thrusters; 
@private int                fuel; 
@private int                speed_x; 
@private int                speed_y; 
@private double             rotation; 

    // Define our lander’s X and Y on-screen coordinates 
@private int loc_x; 
@private int loc_y; 
}

@property (nonatomic, retain) UIImage *lander_nothrust; 

// Declare our class methods 
- (void) newGame; 
- (void) updateLander; 
- (void) rotateLeft:(id)sender; 
- (void) rotateRight:(id)sender; 
- (void) thrustEngine:(id)sender; 

@end

Now, here is what I am doing with my .m file:

#import "GameView.h"

@implementation GameViewController


- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)didReceiveMemoryWarning
{
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    //'timerLoop' function 
    gameLoop = [NSTimer scheduledTimerWithTimeInterval: 0.025 target:self selector:@selector(timerLoop:) userInfo:nil repeats:YES]; 
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
}

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

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

- (void) timerLoop:(NSTimer *)timerObj {
//so this is where I am getting the error
    [(GameView *)self.view updateLander];
    [self.view setNeedsDisplay];
}
- (IBAction)quitGame:(id)sender {
    [self dismissModalViewControllerAnimated:true];
}

- (IBAction)rotateLeft:(id)sender {
    [(GameView *)self.view rotateLeft:sender];
}

- (IBAction)rotateRight:(id)sender {
    [(GameView *)self.view rotateRight:sender];
}

- (IBAction)thrust:(id)sender {
    [(GameView *)self.view thrustEngine:sender];
}
@end

@implementation GameView

@synthesize lander_nothrust;

-(id)initWithCoder:(NSCoder *)aDecoder{
    if(self == [super initWithCoder:aDecoder]){

        //initialize sprites
        NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"lander" ofType:@"tiff"];
        self.lander_nothrust = [UIImage new];
        self.lander_nothrust = [UIImage imageWithContentsOfFile:imagePath];

        [self newGame];
    }
    return self;
}



-(void) newGame{
    gstate = READY; 
    level = EASY; 
    thrusters = THRUSTERS_OFF; 
    fuel = FUEL_INITIAL; 
    loc_x = self.frame.size.width / 2; 
    loc_y = self.frame.size.height / 2; 

    // Set the game as RUNNING 
    gstate = RUNNING; 
}

-(void)updateLander{


}

// rotateLeft - rotate the lander left 
- (void)rotateLeft:(id)sender 
{ 
    // Do Something 
} 

// rotateRight - rotate the lander right 
- (void)rotateRight:(id)sender 
{ 
    // Do Something 
} 

// thrustEngine - fire the thruster on the engine 
- (void)thrustEngine:(id)sender 
{ 
    // Do Something 
} 

-(void)drawRect:(CGRect)rect{
    if(gstate != RUNNING){
        return;
    }
    [self.lander_nothrust drawAtPoint:CGPointMake(loc_x, loc_y)];
    self.backgroundColor = [UIColor redColor]; 
}
@end

As shown above I am getting the error with this line of code:

[(GameView *)self.view updateLander];

I have looked around and I keep hearing that it is because I am calling a method that doesn't exist for my object, but I am not sure why it is not seeing my object implementation. I have even set the custom class in for the UIView in the Identity Inspector to "GameView" as my class.

like image 988
Algorhythm Avatar asked Jan 26 '26 12:01

Algorhythm


1 Answers

The problem is in your nib. Either you have not set the custom class of the view to GameView, or you have not connected the view outlet of File's Owner to that view.

like image 80
rob mayoff Avatar answered Jan 29 '26 05:01

rob mayoff



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!