将值传递给UIView将返回nil

时间:2013-07-31 15:52:04

标签: ios uiview uiviewcontroller

我有一个UIViewController GamePlayViewController和一个UIView JoystickView

我试图将浮动值设置为JoystickView

GamePlayViewController.m

JoystickView *joystick = [[JoystickView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];

joystick.velocity = 123.0f;
[self.view addSubview:joystick];

JoystickView.h

@property(nonatomic) float velocity;

的.m

@synthesize velocity;
-(id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
    NSLog(@"%f", velocity);        //output is 0
}
return self;
}

我错过了什么?

5 个答案:

答案 0 :(得分:3)

您可以通过创建initWithFrameAndVelocity方法来覆盖initWithFrame

-(id)initWithFrame:(CGRect)frame andVelocity:(float)v {
self = [super initWithFrame:frame];
if (self) {
velocity = v;
    NSLog(@"%f", velocity);        //output is 0
}
return self;
}

答案 1 :(得分:2)

在评估NSLog(@"%f", velocity);时,initWithFrame:方法尚未完成执行,因此尚未执行分配joystick.velocity = 123.0f(请记住这是执行顺序< /强>)。这就是为什么NSLog输出的值是 float (0)的默认初始化值。

您可以通过在分配后立即移动NSLog 来解决此问题。

JoystickView *joystick = [[JoystickView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
joystick.velocity = 123.0f;
NSLog(@"%f", joystick.velocity); // prints 123.0
[self.view addSubview:joystick];

答案 2 :(得分:1)

您在velocity方法之后设置了initWithFrame:属性,但NSLog位于initWithFrame:内。此时,速度尚未设定

答案 3 :(得分:1)

把你的

NSLog(@"%f", velocity); 
在initWithFrame之后

。就你的应用所知,速度还没有被初始化为123.0f,因此它显示为0。

答案 4 :(得分:0)

调用initWithFrame后设置速度。因此NSLog输出将为0。