2013-03-07 10 views
5

をトリガし、私は私のアプリでは、奇妙なバグに出くわした:のUITableViewプッシュセグエが複数回

セットアップ

簡単な主従アプリ、iPhoneスタイル(すなわち無分割ビュー、無ポップオーバー、。ちょうどナビゲーションコントローラ、テーブルビューコントローラ、およびビューコントローラ)。

enter image description here

バグ

  1. セクションヘッダーまたはフッターなどテーブルビュー(私のスクリーンショットに濃い灰色部分)の「背景」部分をタッチ。
  2. 指を画面に押したまま、セルに複数回タッチします。
  3. すべての指を離します。 「詳細」ビューが正常にプッシュされますが、[戻る]ボタンをタッチすると、あなたはあなたがすることができ、ステップ2

enter image description here

でセルに触れたように、詳細ビューは何回も重ねたことがわかりますまた、ステップ2で複数のセルに触れると、その先のビューが正しい順に積層されます:)

は私がきれいで、新鮮に作成されたアプリでバグを再現することができた、とtに

それを再現彼はiPhone用のTwitterアプリを最後にリリースした(フィンガー#1の「読み込み中」ラベルに触れ、ツイートを複数回タッチすることによって)。

しかし、設定アプリで「一般」タブ(グループ化された表ビュー)の下で同じ動作を開始できませんでした。

このバグは、iOS 6.0および6.1で再現されました。私はテストする古いバージョンのデバイスを持っていません。

質問ナビゲーション/テーブルビューベースのアプリケーションを作成するときに

これは、既知のトリックですもしそうなら、この(奇妙な)行動を防止するための解決策はありますか?または、これはiOSのバグですか(もしそうなら、それはすでにAppleから知られていますか?)あなたが使用することができ

+0

私のアプリケーションではこのバグを再現できませんでした - セルが選択されるとすぐにセグがプッシュされます:あなたのようにいくつかのセルを選択することはできません - あなたのアプリケーション(または他の方法) )segue pushを処理します。 1つの質問:なぜあなたのテーブルと次のviewControllerの間にあなたのストーリーボードに3つのセグがありますか? 1つは十分なはずです – Vinzzz

+0

これは、複数のセルでセグをテストできるようにすることでした。テーブルビューには静的セルが含まれており、各セルのセグを作成しました。しかし、私の "本当の"アプリはダイナミックなセルを使い、1つのセグ(ctrl +次のコントローラーにドラッグするだけでかなり古典的に作られています。私はちょうどiOS 6.xでテストしたという質問に追加しました。以前のバージョンでテストしていますか? –

+0

そして、このsegueを 'カスタム'として設定し、プログラムで行うときにもこのバグがあります:テーブル代理人の 'didSelectCellAtIndexPath:'から 'performSegueWithIdentifier'を呼び出しますか? これは私が扱う方法ですが、私はいくつかのセル(iOS 6)を選択できません – Vinzzz

答えて

0

これはOSの以前のバージョンでは

のiOS 7にアップルが固定され、Dan F's answerはトリックを行う必要があります。

3

可能ストップギャップ対策は

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender 

を実装し、現在そのセグエを実行しようとしていることを示すためにブールのフラグか何かを使用することです。例:

BOOL doingSegue = NO; 

-(void) viewWillAppear 
{ 

    doingSegue = NO; 
} 

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender 
{ 

    if ([identifier isEqualToString:@"MySegueIdentifier"]) 
    { 
     if (doingSegue) 
     { 
      return NO; 
     } 
     else 
     { 
      doingSegue = YES; 
      return YES; 
     } 
    } 
    return YES; 
} 

スウィフトバージョン

var doingSegue = false 

override func viewWillAppear(_ animated: Bool) { 
    doingSegue = false 
} 

override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool { 
    if identifier == "MySegueIdentifier" { 
     if doingSegue { 
      return false 
     } 
     else { 
      doingSegue = true 
      return true 
     } 
    } 
    return true 
}