質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.55%

アラート処理の中での、傾斜計測

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 943

northpotato

score 35

iOS9, ipodtouch, Xcode7, Objective-C の初心者です。
特殊ローラーに ipodtouch を固定させ、傾斜を測定しています。
iPodtouh と この特殊ローラーの取り付けが完全(平行)ではないため、補正を行おうと思い、下図のように、alert 画面を使おうとしているのですが、2549行でコンパイルエラーが発生しています。
どなたか、改善策、アドバイス、ご教示頂けたら幸いです。
よろしくお願い致します。

イメージ説明

イメージ説明

頂いたアドバイスを元に、下記のように修正し、希望の機能を実現できました。

// ボタン押下時に Alert-1 を表示する
- (IBAction)Button_comp:(UIButton *)sender {
// 補正変数の初期化
    angle_comp_1 =0;
    angle_comp_2 =0;
    angle_comp =0;

    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"補正(ステップ1/2)"
                                        message:@"補正しますか?"
                                        preferredStyle:UIAlertControllerStyleAlert];
    // addActionした順に左から右にボタンが配置される
    [alertController addAction:[UIAlertAction actionWithTitle:@"いいえ" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
        // 「いいえ」ボタンが押された時の処理
        [self cancelButtonPushed];
    }]];

    [alertController addAction:[UIAlertAction actionWithTitle:@"はい" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
        // 「はい」ボタンが押された時の処理
        [self otherButtonPushed];
    }]];

    // 画面に表示します
    [self presentViewController:alertController animated:YES completion:nil];
}

// アラートの「はい」ボタン押下処理
- (void)otherButtonPushed {
    // 定期的に実行するハンドラを設定
    CMAccelerometerHandler handler = ^(CMAccelerometerData *angle_data, NSError *error){
        [self animation:angle_data];
    };

    // 加速度センサーの利用を開始
    [motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue currentQueue]withHandler:handler];
    CMAccelerometerData *angle_data = motionManager.accelerometerData;
    xac = angle_data.acceleration.x; // X 軸: 加速度G
    yac = angle_data.acceleration.y; // Y 軸: 加速度G
    angle_comp_1 = atan2(yac, xac) * - 180.0 / M_PI;

    // 傾斜角を小数点以下1桁の実数表示
    self.Incl_Label.text = [NSString stringWithFormat:@"%4.1f", angle];
    self.black.transform = CGAffineTransformMakeRotation(M_PI * angle / 180);
    [self alert_2];
}

// アラートの「いいえ」ボタン押下処理
- (void)cancelButtonPushed {
    NSLog(@"いいえ!");
}

- (void)alert_2{
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"補正(ステップ2/2)"
                    message:@"180度、水平反転してください。"
                    preferredStyle:UIAlertControllerStyleAlert];

    // addActionした順に左から右にボタンが配置される
    [alertController addAction:[UIAlertAction actionWithTitle:@"キャンセル" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
        // 「いいえ」ボタンが押された時の処理
        [self cancelButtonPushed];
    }]];
    [alertController addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
        // 「はい」ボタンが押された時の処理
        [self otherButtonPushed_2];
    }]];

    // 画面に表示します
    [self presentViewController:alertController animated:YES completion:nil];
}

// アラートの「はい」ボタン押下処理
- (void)otherButtonPushed_2 {
    // 傾斜角を小数点以下1桁の実数表示
    self.Incl_Label.text = [NSString stringWithFormat:@"%4.1f", angle];
    self.black.transform = CGAffineTransformMakeRotation(M_PI * angle / 180);
    CMAccelerometerData *angle_data = motionManager.accelerometerData;
    xac = angle_data.acceleration.x; // X 軸: 加速度G
    yac = angle_data.acceleration.y; // Y 軸: 加速度G
    angle_comp_2 = atan2(yac, xac) * - 180.0 / M_PI;

    angle_comp = (angle_comp_1 + angle_comp_2)/2 ;
    self.comp_value.text = [NSString stringWithFormat:@"%4.1f", angle_comp];

    //  角度計測を停止する
    [motionManager stopAccelerometerUpdates];

    //angle_ar[] の初期化
    int i;
    for (i=0; i <500; i++) {angle_ar[i] = 0; }

    // angle_disp[] 初期化
    for (i=0; i<10; i++) { angle_disp[i] = 0;}

    // jcount の 初期化
    jcount =0;
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

エラーメッセージ通り、angle_dataという変数が定義されていないということです。
定義しているつもりなのであれば、angle_dataをどこでどのように定義しているか説明してください。

ただ、「アラートのはいボタン押下処理」(otherButtonPushes)の内容を見ると、この中でCMMotionManagerを生成していることから、「はい」ボタンが押されてから現在の傾きを測定したいようにも見えます。もしそうであれば、angle_dataをパラメータで受け取るのではなくて、ここで傾きデータ測定処理を開始する必要があるのだと思います。(逆に、ここで測定するのでなくangle_dataをパラメータで受け取りたいのであれば、CMMotionManagerの生成は不要だと思います。)

ついでに指摘しておくと、「はい」ボタンが押された時の処理と「いいえ」ボタンが押された時の処理のボタンの割り当てが逆になっていると思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/09 06:25 編集

    回答、ありがとうございます。
    angle_data の定義部分を追加しました。
    でも、これがうまく機能していないようです。
    私がやりたかったのは、背中の傾斜を測る前(測定と測定の間でも)に
    デバイスの補正(ipodtouch とローラー部が平行に設置されていない場合)を
    するのに、まずアラート1(補正しますか)を表示し、ここで「はい」の補正計測値 angle_comp_1 を取得し、次にアラート2を表示してデバイスを180度回転させて、「はい」を押した場合、補正計測値 angle_comp_2 を取得し、この二つの値から、補正値自体を求めたいと考えています。
    ただ、背中の傾斜を測るときに、CMMotionManager を発生させているのに、アラート部分でも、もう一度、CMMotionManager を発生させていいのか不明でしたが、とりあえず、入れてみたら、上記の図のようなコンパイルエラーがでてしまったというのが実状です。
    そこで、質問なのですが、一度、CMMotionManager を発生したら、それをアラートの中で使うことは、可能なのでしょうか。 再度、CMMotionManager を発生させる必要はないのでしょうか。
    それと、使用者は右利きが多いと思うので、「はい」の部分を右の方に持って来たかったという理由で、上記のようにしました。
    よろしくお願い致します。

    キャンセル

  • 2016/06/09 08:51 編集

    > angle_data の定義部分を追加しました。

    もしかして
    - (void)otherButtonPushed:(CMAccelerometerData *)angle_data;
    をangle_dataの定義部分だと言っているのですか?
    これは、otherButtonPushedメソッドの宣言部分で、その呼び出しパラメータにangle_dataというパラメータ名を使用していることを表しているだけであり、angle_dataを定義している部分ではありません。

    otherButtonPushedの呼び出しにangle_dataという変数を使用するのなら、どこかでangle_dataという変数が宣言されていて、そのangle_dataという変数に加速度センサーの計測値を設定する処理があるはずだろうから、それを示してくださいと言っています。
    でも、コメントの内容から推察する限り、そんな変数はなくて、意味もわからず何かをコピペして、必要もないのにパラメータを引き渡す形にしただけのように思いました。

    「背中の傾斜を測るときに、CMMotionManager を発生させている」と書いていることから、最初からmotionManagerという変数には既にCMMotionManagerが生成されているのだろうと思います。だったら、otherButtonPushedメソッドのパラメータでangle_dataを引き渡すのも不要だし、otherButtonPushedの中でCMMotionManagerを新たに生成する処理も不要です。
    startAccelerometerUpdatesToQueueかstartAccelerometerUpdatesで既に計測開始しているのであれば、
    otherButtonPushedの中で
    CMAccelerometerData *angle_data = motionManager.accelerometerData;
    として、現在の加速度センサーの計測値をangle_dataというローカル変数に取得すればよいだけだと思います。

    あと、「はい」ボタンが押された時の処理と「いいえ」ボタンが押された時の処理のボタンの割り当てが逆になっているという指摘は、ボタンの並び順を指摘しているのではなく、
    actionWithTitleで"いいえ"と表示するボタンの処理がotherButtonPushed呼び出しになっていて、
    actionWithTitleで"はい"と表示するボタンの処理がcancelButtonPushed呼び出しになっているので
    「はい」ボタンを押すとキャンセルになりますよと指摘しています。

    キャンセル

  • 2016/06/11 17:19

    更なるアドバイス、ありがとうございます。
    >startAccelerometerUpdatesToQueueかstartAccelerometerUpdatesで既に計測開始しているのであれば、
    otherButtonPushedの中で
    CMAccelerometerData *angle_data = motionManager.accelerometerData;
    として、現在の加速度センサーの計測値をangle_dataというローカル変数に取得すればよいだけだと思います。

    このステップを入れ、加速度センサーの停止やら開始を入れたり、色々、試行錯誤を繰り返し、追加のプログラムにしたところ、希望のデバイスの補正機能を実現できました。これで、更に一歩前進できました。
    本当に、ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.55%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる