【问题标题】:Getting "unrecognized selector sent to instance" For UIView获取 UIView 的“无法识别的选择器发送到实例”
【发布时间】:2012-02-06 03:42:20
【问题描述】:

我试图将我的 UIView 类的实现强制转换为我的视图控制器。但是,当尝试为我的类调用方法时,它会抛出“无法识别的选择器发送到实例”。

这是我在头文件中所做的:

#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

现在,这是我对 .m 文件所做的事情:

#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

如上所示,这行代码出现错误:

[(GameView *)self.view updateLander];

我环顾四周,一直听说这是因为我正在调用我的对象不存在的方法,但我不确定为什么它没有看到我的对象实现。我什至将 Identity Inspector 中 UIView 的自定义类设置为“GameView”作为我的类。

【问题讨论】:

    标签: iphone objective-c xcode


    【解决方案1】:

    问题出在你的笔尖上。要么您没有将视图的自定义类设置为GameView,要么您没有将文件所有者的view 出口连接到该视图。

    【讨论】:

    • @rob mayoff 的回答是正确的。因为我遇到了同样的问题
    • 听起来不错。我在工作,但一旦我回到家。我会试试谢谢!
    猜你喜欢
    • 2016-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多