将浮点值传递给另一个ViewController

时间:2013-11-23 18:33:28

标签: ios objective-c

我有2个控制器,我想从floatLevelViewController发送ViewController。但它总是将其发送为0(零)。这是我的LevelViewController.m

ViewController *inGame = [[ViewController alloc] init];
enemySpeedShouldBe = 0.800f - 0.07f * levelSelected;
inGame.enemySpeed = enemySpeedShouldBe;

其中levelSelectedenemySpeedShouldBe也是浮点数。

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];
}

2 个答案:

答案 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]);