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

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

ただいまの
回答率

90.75%

  • Swift

    6691questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • TableView

    105questions

    TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

UITableViewで、presentViewControllerが遅くなる件

解決済

回答 1

投稿 編集

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

Kw6ZG2sV

score 55

iosアプリ作成をしていて、uitableviewを使用したページがあるのですが、
そちらでpresentの第一引数にalertControllerを設定して、
そのセルが押された際に、アラートが表示され「はい、いいえ」どちらかを選び初めて
画面遷移するような仕様にしていると、
タップしてからアラートが出るまでとても時間がかかったり、
そうかと思えば2回タップするとすぐに表示されたりする現象で悩まされていました。
するとリンク内容こちらのサイトに同じような現象が書かれていました。ですが、数年前の記事であること、objective-cであることなどでうまくいきませんでした。

ソースを下記に記載します。
コメントアウト部分の"ここの行"をこのように変えると良いというのを海外のサイトで目にしたので試しましたが、
アラートが出ずに、次の画面に遷移していまいそこで落ちてしまいます。
解決策を知っている方はおられないでしょうか?

DispatchQueue.main.async {
                self.present(alertController, animated: true, completion: nil)
            }
 func tableView(_ table: UITableView, didSelectRowAt indexPath: IndexPath) {

        if status[indexPath.row] == 0 {
            print("アイウエオ")
            let alertController = UIAlertController(title: "", message: "遷移しますか?", preferredStyle: UIAlertControllerStyle.alert)
            let actionOK = UIAlertAction(title: "OK", style: UIAlertActionStyle.default ,handler:{
                (action:UIAlertAction!) -> Void in

                self.appDelegate.id = self.user_id[indexPath.row] //この行追加

                let storyboard:UIStoryboard = self.storyboard!
                let lp = storyboard.instantiateViewController(withIdentifier: "second") as! SecondViewController
                lp.modalTransitionStyle = UIModalTransitionStyle.partialCurl
                self.navigationController?.pushViewController(lp, animated: true)
            })
            let cancelAction:UIAlertAction = UIAlertAction(title: "Cancel",
                                                           style: UIAlertActionStyle.cancel,
                                                           handler:{
                                                            (action:UIAlertAction!) -> Void in
                                                            print("Cancel")
            })

            alertController.addAction(actionOK)
            alertController.addAction(cancelAction)

            self.present(alertController, animated: true, completion: nil)//ここの行
        }else{
     print("カキクケコ")
//ここから追加部分
     self.appDelegate.id = self.user_id[indexPath.row]

        let storyboard:UIStoryboard = self.storyboard!
        let lp = storyboard.instantiateViewController(withIdentifier: "second") as! SecondViewController
        lp.modalTransitionStyle = UIModalTransitionStyle.partialCurl
        self.navigationController?.pushViewController(lp, animated: true)
             }
    }
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • Kw6ZG2sV

    2018/05/17 10:25

    はい、その通りです。本文修正いたしました。

    キャンセル

  • fuzzball

    2018/05/17 10:27

    tableView(_:didSelectRowAt:)の中のコードはこれで全てでしょうか? status[indexPath.row] == 0 のとき、他に実行されるコードは無いですか?

    キャンセル

  • Kw6ZG2sV

    2018/05/17 10:39

    appDelegateに保存させる記述など今回の件には不要だと削除していた部分が少しあったのですが、それを戻し本番と同じ状態にしました。お手数おかけいたします。

    キャンセル

回答 1

checkベストアンサー

0

今追記したコードの、

let storyboard:UIStoryboard = self.storyboard!
let lp = storyboard.instantiateViewController(withIdentifier: "second") as! SecondViewController
lp.modalTransitionStyle = UIModalTransitionStyle.partialCurl
self.navigationController?.pushViewController(lp, animated: true)

を削除して下さい。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/05/17 11:03 編集

    こちら削除してしまうと、”status[indexPath.row] == 0”以外の条件の際(status[indexPath.row]の値が==1、==2の場合とあるのですが)セルをタップしても何も起きないことになってしまいます。

    また、削除すると上に述べたように何も起きなくなるだけではなく、セルタップの際も表示速度は変わらず遅く(ひどい時押してから6~7秒)、2回タップではすぐに表示と以前と変わらずでした。

    キャンセル

  • 2018/05/17 11:05

    status[indexPath.row] == 0 のときに通らないようにして下さい。

    キャンセル

  • 2018/05/17 11:16

    elseで通らないようにしましたが、アラート表示速度、2回タップ問題は変わらずでした。やはり上記で記載しましたリンク先ページが言うようなバグなのでしょうか?

    キャンセル

  • 2018/05/17 11:20

    タップしたときに if status[indexPath.row] == 0 { の中に入っているかどうか、print文を追加するなどして確認して下さい。

    キャンセル

  • 2018/05/17 11:28

    status[indexPath.row]が0の時、それ以外の時でpritnで試しました。ifの分岐でいうと正常ですが、問題は解決されていませんでした。

    キャンセル

  • 2018/05/17 11:33

    今の状態で、リンク先の対処方法(DispatchQueue.main.async {}で囲う)を行うとどうでしょうか?

    キャンセル

  • 2018/05/17 11:49

    おぉ、すごい!出来ました!
    ありがとうございます!!
    でもなぜ、最初の状態で対処方法を行ったら、アラートが出ずに画面遷移して落ちていたのでしょうか?

    キャンセル

  • 2018/05/17 11:55

    落ちた原因は分かりませんが、アラートが正しく表示されなかったのは、 if status[indexPath.row] == 0 のときにも遷移のコードが実行されていたからです。(2つの遷移を同時に行おうとしていたため)

    キャンセル

  • 2018/05/17 11:59

    了解致しました!とても助かりました!正解だと思い込んでいるコードでもしっかりと見直すことが大切だと感じました。ありがとうございました!

    キャンセル

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

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

関連した質問

同じタグがついた質問を見る

  • Swift

    6691questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • TableView

    105questions

    TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。