我有2个控制器,我想从float
向LevelViewController
发送ViewController
。但它总是将其发送为0(零)。这是我的LevelViewController.m
ViewController *inGame = [[ViewController alloc] init];
enemySpeedShouldBe = 0.800f - 0.07f * levelSelected;
inGame.enemySpeed = enemySpeedShouldBe;
其中levelSelected
和enemySpeedShouldBe
也是浮点数。
NSLog(@"%f", levelSelected)
为我提供了正确的值(1.0,2.0等),但当我将其发送到ViewController
时,它等于0。
这是我的ViewController.h
@property (nonatomic) float enemySpeed;
我已经阅读过这个问题,但我找不到任何方法让它发挥作用。
- / - / - / - / - / - / - / - / - / - / - 编辑 - / - / - / - / - / - / - / - / - / -
这是我在“ViewController.m”中的敌人毫秒计数器方法
-(void)enemyStartCounter{
enemyMs += 0.001;
if(enemyMs > enemySpeed){ // i use 'enemySpeed' nowhere except here
[enemyTimer invalidate];
[fire setHidden:YES];
[self enemyFired];
}
}
-(void)enemyCounter{
enemyMs = 0;
enemyTimer = [NSTimer scheduledTimerWithTimeInterval:0.001/1.0 target:self selector:@selector(enemyStartCounter) userInfo:nil repeats:YES];
}
和我在“LevelViewController.m”
中的动作方法内的按钮触摸- (void)didTapLevel:(UIButton *)buttonn{
levelSelected = (float)buttonn.tag + 1.0f ;
ViewController *inGame = [[ViewController alloc] init];
enemySpeedShouldBe = 0.800f - (0.07f * levelSelected);
inGame.enemySpeed = enemySpeedShouldBe;
[self performSegueWithIdentifier:@"1player" sender:self];
}
答案 0 :(得分:1)
在您的代码中的某个时刻,您正在创建此ViewController
实例,并使用enemySpeed
的值对其进行配置,然后可能将其丢弃。
在其他地方,正在创建另一个实例。此实例未配置,但您在其上调用enemyStartCounter
,因此它会记录零。
您需要确保了解每个类的实例以及它们的使用方式。您可以从Storyboard segue创建视图控制器,在这种情况下,您需要通过使用prepareForSegue:sender:
拦截segue来获取对它的引用。
此代码创建了两个不同的实例:
- (void)didTapLevel:(UIButton *)buttonn{
ViewController *inGame = [[ViewController alloc] init]; // create first instance
inGame.enemySpeed = enemySpeedShouldBe;
[self performSegueWithIdentifier:@"1player" sender:self]; // create second instance
}
所以你应该做的是:
- (void)didTapLevel:(UIButton *)buttonn{
[self performSegueWithIdentifier:@"1player" sender:self]; // create single instance
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
ViewController *inGame = (ViewController *)[segue destinationViewController]; // get single instance
inGame.enemySpeed = enemySpeedShouldBe;
}
答案 1 :(得分:0)
我更喜欢创建一个NSNumber属性来执行此操作:
@property (strong, nonatomic) NSNumber *enemySpeed; // in your viewController
// passing the parameter
inGame.enemySpeed = [NSNumber numberWithFloat:(0.800f - 0.07f * levelSelected)];
然后,如果您在控制器之间传递属性,则可以执行以下操作:
NSLog(@"%f", [enemySpeed floatValue]);