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

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

ただいまの
回答率

90.23%

Xcodeでアラートがうまく表示されない場合の解決法は?

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 834
退会済みユーザー

退会済みユーザー

下記のソースコードは、ボタンを長押しするとアラートが表示されるプログラムです。
しかし、長押ししても1度はアラートが表示されますが、アラートを閉じてまたボタン長押ししても表示されないのです。

さらにログに下記のようなメッセージが表示されます。
解決策をアドバイス頂けると幸いです。

「ログ」
2016-12-20 17:13:17.992 SeBtn[2079:81223] Warning: Attempt to present <UIAlertController: 0x7fb671e9e280>  on <ViewController: 0x7fb671c07d90> which is already presenting <UIAlertController: 0x7fb671e1ddc0>

[ViewController.m]

#import "ViewController.h"
#import "AppDelegate.h"
AppDelegate *ViewAppDelegate;
UILongPressGestureRecognizer *LongGesture;

@interface ViewController ()
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    //ロングタップ開始
     [self setLongTapGesture];

    //delegateデータを送る準備
    ViewAppDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

//ロングタップ開始
- (void)setLongTapGesture{
    LongGesture =
    [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(long_tapped:)];
    LongGesture.delegate = self;

}

//音声アラートname_keep_str1-24
- (void)voice_Alert {

    //音声名代入
    if(_btn1.tag == 1) {

        ac =
        [UIAlertController alertControllerWithTitle:@"音声名"
                                            message:ViewAppDelegate.name_keep_str1
                                     preferredStyle:UIAlertControllerStyleAlert];

    }

    if(_btn2.tag == 2) {

        ac =
        [UIAlertController alertControllerWithTitle:@"音声名"
                                            message:ViewAppDelegate.name_keep_str2
                                     preferredStyle:UIAlertControllerStyleAlert];;
    }

    if(_btn3.tag == 3) {

        ac =
        [UIAlertController alertControllerWithTitle:@"音声名"
                                            message:ViewAppDelegate.name_keep_str3
                                     preferredStyle:UIAlertControllerStyleAlert];
    }

    if(_btn4.tag == 4) {

        ac =
        [UIAlertController alertControllerWithTitle:@"音声名"
                                            message:ViewAppDelegate.name_keep_str4
                                     preferredStyle:UIAlertControllerStyleAlert];
    }

    if(_btn5.tag == 5) {

        ac =
        [UIAlertController alertControllerWithTitle:@"音声名"
                                            message:ViewAppDelegate.name_keep_str5
                                     preferredStyle:UIAlertControllerStyleAlert];
    }

    // コントローラを生成

    // Cancel用のアクションを生成
    UIAlertAction * recoAction =
    [UIAlertAction actionWithTitle:@"録音"
                             style:UIAlertActionStyleCancel
                           handler:^(UIAlertAction * action) {
                               // ボタンタップ時の処理
                           }];

    UIAlertAction * delAction =
    [UIAlertAction actionWithTitle:@"削除"
                             style:UIAlertActionStyleDefault
                           handler:^(UIAlertAction * action) {

                           }];

    [ac addAction:recoAction];
    [ac addAction:delAction];

       // アラート表示処理
    [self presentViewController:ac animated:YES completion:nil];

}

//ロングタップ
- (void)long_tapped:(UILongPressGestureRecognizer *)sender{

    //ボタンに応じてアラート表示
    //btn1
    if(_btn1.tag == 1) {

        [self voice_Alert];
    }
    //btn2
    if(_btn2.tag == 2) {
        [self voice_Alert];
    }
    //btn3
    if(_btn3.tag == 3) {
        [self voice_Alert];
    }
    //btn4
    if(_btn4.tag == 4) {
        [self voice_Alert];
    }
    //btn5
    if(_btn5.tag == 5) {
        [self voice_Alert];
    }
}

//action btn1-24
- (IBAction)btn1:(id)sender {

    //ロングタップ有効化
    //btn に追加
    [_btn1 addGestureRecognizer:LongGesture];
    _btn1.userInteractionEnabled = YES;

}

- (IBAction)btn2:(id)sender {

    [_btn2 addGestureRecognizer:LongGesture];
    _btn2.userInteractionEnabled = YES;

}

- (IBAction)btn3:(id)sender {

    [_btn3 addGestureRecognizer:LongGesture];
    _btn3.userInteractionEnabled = YES;

}

- (IBAction)btn4:(id)sender {

    [_btn4 addGestureRecognizer:LongGesture];
    _btn4.userInteractionEnabled = YES;

}

- (IBAction)btn5:(id)sender {

    [_btn5 addGestureRecognizer:LongGesture];
    _btn5.userInteractionEnabled = YES;

}

@end

[ViewController.h]

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController<UIGestureRecognizerDelegate,UIAlertViewDelegate> {
    // アラートコントローラを生成
    UIAlertController * ac;
}

//ロングタップ
- (void)long_tapped:(UILongPressGestureRecognizer *)sender;

//ロングタップ開始
- (void)setLongTapGesture;

//音声アラート
- (void)voice_Alert;
@end
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

なんとなくやりたいことは分かりましたが、コードが無茶苦茶ですね。

パッと見で気付いたことを書いておきます。

  • UILongPressGestureRecognizerはボタンの数だけ用意して、それぞれのボタンにaddGestureRecognizerして下さい。

  • 今はタップするたびにaddGestureRecognizerしていますが、最初に一度だけにして下さい。

  • 各ボタンのtagを調べていますが、全く意味がありません。

long_tapped:(UILongPressGestureRecognizer *)sender
{
    UIButton *button = (UIButton *)sender.view; //長押ししたボタンを取得
    switch (button.tag)
    {
        case 1:
            //ボタン1の処理
            break;
        case 2:
            //ボタン2の処理
            break;
        :
    }
}

として下さい。

とりあえずこんなところで。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/12/20 17:45

    すいません、わたしの説明が不足でした。アラートを閉じてまたボタン長押ししても表示されないのです。

    キャンセル

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

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