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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With