-3

假设我的应用程序有两个选项卡,每个选项卡都有自己的视图控制器类。在第一个视图控制器中,我想显示加速度计数据,在第二个视图控制器中显示陀螺仪数据。所以我在这个新类中创建了新的类,称为 IMU 我有几个方法,例如获取运动管理器的实例并为其分配内存第二种方法采用运动管理器的实例和三个双精度值(x,y,z),该方法假设开始更新加速度计并指定间隔并开始加速度更新,最后将加速度计数据分配给传递的双精度值(x,y,z)现在,在第一个视图控制器中,加载方法正在调用该方法从 IMU 类中传递一个运动管理器的实例和三个双精度值(&x,&y,&z),

这是 IMU 类中的方法

-(void) getAcceleromaterData:(CMMotionManager *) motionManager and:(double *) x and: (double *)y and: (double *)z{
    [motionManager startAccelerometerUpdates];
    if (motionManager.accelerometerAvailable) {
        motionManager.accelerometerUpdateInterval = 0.01;
        queue = [NSOperationQueue currentQueue];
        [motionManager startAccelerometerUpdatesToQueue:queue
                                                 withHandler: ^(CMAccelerometerData *AccelerometerData, NSError *error) {
                                                     CMAcceleration acceleration = AccelerometerData.acceleration;
                                                     *x = acceleration.x;
                                                     *y = acceleration.y;
                                                     *z = acceleration.z;
                                                 }];
    }
}

这就是我在视图控制器中的调用方式

@implementation FirstViewController
double AccX, AccY, AccZ;
- (void)viewDidLoad
{
    [super viewDidLoad];

    self.imu = [IMU new];
    self.motionManager = [CMMotionManager new];
    [self.imu getAcceleromaterData:self.motionManager and:&AccX and:&AccY and:&AccZ];

// assign values to labels 
    self.accX.text = [NSString stringWithFormat:@"%0.5f", AccX];
    self.accY.text = [NSString stringWithFormat:@"%0.5f", AccY];
    self.accZ.text = [NSString stringWithFormat:@"%0.5f", AccZ];

}

希望更清楚

4

1 回答 1

0

您不能从块中更改方法参数。只有用 __block 声明的局部变量才能在块内更改。例如:__block int accX; 但这仅适用于局部变量。

考虑在每次加速度值更改时在视图控制器上调用委托方法。这是示例代码:

这是 IMU.h:

#import <Foundation/Foundation.h>
#import <CoreMotion/CoreMotion.h>

@protocol CoreMotionDelegate <NSObject>

-(void)motionDataAvailable:(double)x and:(double)y and:(double)z;

@end

@interface IMU : NSObject

@property(nonatomic, assign) id<CoreMotionDelegate> delegate;

-(void) getAcceleromaterData:(CMMotionManager *)motionManager;
@end

IMU.m

#import "IMU.h"

@implementation IMU {
    NSOperationQueue *queue;
}

-(void)getAcceleromaterData:(CMMotionManager *)motionManager {
    [motionManager startAccelerometerUpdates];
    if (motionManager.accelerometerAvailable) {
        motionManager.accelerometerUpdateInterval = 0.01;
        queue = [NSOperationQueue currentQueue];
        [motionManager startAccelerometerUpdatesToQueue:queue
                        withHandler: ^(CMAccelerometerData *AccelerometerData, NSError *error) {
                            CMAcceleration acceleration = AccelerometerData.acceleration;
                            [self.delegate motionDataAvailable:acceleration.x and:acceleration.y and:acceleration.z];
                                            }];
    }
}

这是 ViewController.h 类。您从中调用 IMU 方法的方法:

@interface FirstViewController : UIViewController <CoreMotionDelegate>

@property (nonatomic, strong) IMU *imu;
@property (strong, nonatomic) CMMotionManager *motionManager;
@property (strong, nonatomic) IBOutlet UILabel *someLabel;

@end

和 FirstViewController.m 类

@implementation FirstViewController

-(void)motionDataAvailable:(double)x and:(double)y and:(double)z {
// Here you update view, call other methods and so on...
    self.someLabel.text = [NSString stringWithFormat:@"%f", x];
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.imu = [IMU new];
    self.motionManager = [CMMotionManager new];

    // don't forget this or delegate method will never be called
    self.imu.delegate = self;

    // assign values to labels
    [self.imu getAcceleromaterData:self.motionManager];

}

这样,当加速度值发生变化时,您的 ViewController 将收到通知,以便您可以相应地更新视图。

于 2013-08-12T13:30:28.363 回答