2017-02-15 18 views
0

以下のコードは、ユーザーがテーブルビューで行をタッチしたときにプログラムによって表示コントローラを表示します。コードは 'didSelectRowtIndex'パスにあり、テーブルビューはViewControllerクラスにあり、ここではテーブルビューデリゲートを実装しています。私が抱えている問題は、表示しようとしているビューコントローラがテーブルビュー行の2番目のタッチにしか表示されないということです。ただし、親ビューコントローラが最初に読み込まれると、最初のタッチで表示されます。以下子ビュー・コントローラのうちの2つのプレゼンテーションのための「didSelectRowAtIndexPath」内のコードは次のとおりViewControllerプレゼンテーションSwift 3

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 

    if indexPath.row == 0 { 

     let stockTable = StockTableVC() 
     self.present(stockTable, animated: false, completion: nil) 
    } 

    else indexPath.row == 1 { 

     let accountTable = AccountTableVC() 
     self.present(accountTable, animated: false, completion: nil) 
    } 

    ... 

どちら上記行選択時に毎回呼び出されているが、上somtimes提示されていない現在ビュー・コントローラ・メソッド最初の選択(または少なくとも表示されません)。この謎の助けがあれば、どんな助けにもなります。

-お問い合わせ

答えて

0

は私のdelay機能(hereを文書化)を使用してください:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    if indexPath.row == 0 { 
     let stockTable = StockTableVC() 
     delay(0.1) { 
      self.present(stockTable, animated: false, completion: nil) 
     } 
    } 
    // ... and so on ... 
} 

これは、あなたがプレゼンテーションを開始する前に終了する選択プロセスの時間を与えます。

+0

ありがとう、上記の行選択解除ソリューションはうまく動作しますが、問題がある場合は後者を試してみます。 – jdeckman

+0

遅延が0.1を超えるとどうなりますか?アプリがクラッシュします。行の選択を解除するよりも、これを使用するのが最も推奨されるのはなぜですか? –

+1

@JuanCurtiタイミングに関してではありません。それはスレッドについてです。従って、より短い遅延でさえ確実に機能する。ここで使用しているテクニックは、メインスレッドを終了してrunloopを完了させ、次のrunloopのメインスレッドに戻ることです。私たちは、 'didSelect'メソッドが完了して呼び出しスタック全体が終了することを保証しています。なぜなら、それまではメインスレッドに戻ることができないからです。そしてその時点で、その時点で_only_、私たちはプレゼンテーションを開始するのは安全です。 – matt

1

最初に行の選択を解除する必要があります。プレゼンテーションの前にこれを追加してください:

それは私にとって本当にミステリーです。しかし、これは前に仕事を得るのを助けました、私はそれもあなたのために動作することを願っています。

+0

うわー、うまくいきます。どうもありがとうございました!私はSwiftの以前のバージョンでこの問題があったとは思わないが、間違っているかもしれない。 – jdeckman

+0

これはSwift 3のものなのかどうか分かりませんが、それは何度も私に起こりました。それが正しいとマークして、誰もがこれが修正されたことを知ることができます –

+0

ありがとう。私は正しいとマークする方法をStackOverflowしなければならなかった。それはあまり明らかではありません。興味深い。 – jdeckman

関連する問題