0

OK、コードは機能するようになりましたが、まだ作業が必要です。私が取得した値は「スティッキー」であり、安定していません (磁北に戻ろうとするたびに少し移動するようです)。デバイスをリフレッシュ/ウェイクアップするには、デバイスを少し振る必要があります。値..

ゲーム.h

#import <Foundation/Foundation.h>

#import "CoreLocation.h"

@interface Game : NSObject

<CLLocationManagerDelegate>

@property BOOL stopButtonPressed;

-(void) play;

@end

Game.m

@implementation Game

- (id) init 
{
    self = [super init];

    self.stopButtonPressed = NO;

    CLLocationManager *locationManager;

    locationManager = [[CLLocationManager alloc] init];

    locationManager.delegate = self;

    return self;
}

-(void) play 
{

    [locationManager startUpdatingHeading]; 

    while(!self.stopButtonPressed)
    {
         double degrees = locationManager.heading.magneticHeading;

         int degreesRounded = (int)degrees;

         NSLog(@"Degrees : %i", degreesRounded);
    }
}

@end

MyViewController.m

@interface MyViewController()
{
    Game *game;
}
@end

@implementation MyViewController

-(void) viewDidLoad
{
    game = [[Game alloc] init];
}

- (IBAction)playPressed:(UIButton *)sender 
{
    [game performSelectorInBackground:@selector(play) withObject:nil];
}

- (IBAction)stopPressed:(UIButton *)sender 
{
    game.stopButtonPressed = YES;
}

@end

私は何を間違っていますか?

4

2 に答える 2

2

このコードはスレッドをブロックし、それがメイン スレッドで発生している場合、ボタンが押されることはありません。

CLLocationManager は非同期メカニズムです。それを適切に扱うには、場所への更新が利用可能になったときに通知するデリゲートを提供する必要があります (これはselfほとんどの場合 ( selfviewController など) です)。CLLocationManagerDelegate のドキュメントを参照してください。

...
    CLLocationManager *locationManager;
    locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;
    [locationManager startUpdatingHeading];
}

- (void)locationManager:manager didUpdateHeading:newHeading {
    double degrees = newHeading.magneticHeading;
     NSLog(@"Degrees : %F", degrees);
}
于 2012-07-30T14:14:07.507 に答える
0

プロパティを直接呼び出すのではなく、デリゲートCLLocationManagerメソッドをキャッチする必要があります。 CLLocationManagerDelegate

于 2012-07-30T14:13:07.040 に答える