5

アプリで奇妙なバグに遭遇しました:

セットアップ

シンプルなマスターディテールアプリ、iPhoneスタイル(つまり、分割ビュー、ポップオーバーなし、ナビゲーションコントローラー、テーブルビューコントローラー、およびビューコントローラーのみ)。

ここに画像の説明を入力してください

不具合

  1. セクションヘッダーやフッターなど、テーブルビューの「背景」部分(スクリーンショットの暗い灰色の部分)をタッチします。
  2. 画面に指を置いたまま、セルを複数回タッチします。
  3. すべての指を離します。「詳細」ビューは通常どおりに押されますが、戻るボタンをタッチすると、手順2でセルをタッチした回数だけ詳細ビューがスタックされていることがわかります。

ここに画像の説明を入力してください

手順2で複数のセルにタッチすることもでき、それらの宛先ビューは正しい順序でスタックされます:)

それを再現する

クリーンで新しく作成されたアプリと、iPhone用のTwitterアプリの最後のリリースで、バグを再現することができました(指#1で「読み込み中」ラベルをタッチし、ツイートを複数回タッチすることで)。

ただし、設定アプリの[全般]タブ(グループ化されたテーブルビュー)で同じ動作をトリガーできませんでした。

このバグはiOS6.0および6.1で再現されました。テストする古いバージョンのデバイスがありません。

質問

これは、ナビゲーション/テーブルビューベースのアプリを作成する際の既知のトリックですか?もしそうなら、この(奇妙な)動作を防ぐための解決策はありますか?それとも、これはiOSのバグですか(もしそうなら、Appleからすでに知られていますか)?

4

2 に答える 2

4

使用できる可能性のある一時的な対策は、実装することです

- (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;
}

Swiftバージョン

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
}
于 2013-03-07T15:57:15.463 に答える
0

これは、iOS7のAppleによって修正されています。

以前のバージョンのOSの場合、DanFの答えでうまくいくはずです。

于 2013-09-26T13:06:38.653 に答える