1

左側にテーブル ビュー、右側に画像ビューを持つ分割ビューのような「設定ページ」を実装しようとしています。すべて問題ありませんが、テーブル ビューのセル タッチを速くタップしようとすると、遅延が発生します。DidSelectRowAtIndexパスは呼び出されていませんが、セルは点滅しています。

私が試したこと、

  1. 画像変更ロジックをwillSelectRowAtIndexPathからに移動DidSelectRowAtIndex

  2. デリゲートメソッドからすべてを削除しました(画像の読み込みによるものかどうかを確認するため)

この有線の問題を解決するにはどうすればよいですか?

TableDatasource

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *cellIdentifier = @"tutorialCell";
        CustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
        if (cell == nil) {
            NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"TutorialTableCell" owner:nil options:nil];
            cell = [nib objectAtIndex:0];        
        }
        NSDictionary * dic = [dictArray objectAtIndex:indexPath.row];
        cell.tutorialText.text = [dic valueForKey:TUTORIAL_TEXT];
        cell.tutorialImage.image = [UIImage imageNamed:[dic valueForKey:TUTORIAL_ICON]];
        cell.contentView.backgroundColor = [UIColor colorWithHex:@"#36393D" alpha:1.0];
        UIView *bgColorView = [[UIView alloc] init];
        [bgColorView setBackgroundColor:[UIColor colorWithHex:@"#1f1f1f" alpha:1.0]];
        [cell setSelectedBackgroundView:bgColorView];
        return cell;
    }

TableView デリゲート

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSDictionary * dic = [dictArray objectAtIndex:indexPath.row];
    _tutorialImageView.image = [UIImage imageNamed:[dic valueForKey:TUTORIAL_IMAGE]];
}
4

2 に答える 2

2

UITableViews はdelaysContentTouches、デフォルトで有効になっている UIScrollViews のサブクラスです。これは、タッチがサブビューに移動できるようにする前に、UIScrollView がタッチがスワイプ ジェスチャまたはスクロール アクションの一部であるかどうかを判断しようとするためです。本当にそのアクションを無効にしたい場合はdelaysContentTouches、テーブル ビューの を NO に設定します。これにより、タップするとすぐにテーブル ビューのセルに移動するため、スクロールが少し奇妙に動作する可能性があります。実際には、遅延のないタッチ アクションよりも遅延のタッチ アクションの方が好きであることに気付くかもしれません。

編集クレメントは、彼はすでにそれを試したと言っているので、ここに別のアイデアがあります.

投稿されたコードimageNamed:では、少なくとも最初はこれらの画像をディスク ( ) からロードしています。UIKit はキャッシュを行う場合があります。チュートリアルの画像が非常に大きい場合、それらをより速くロードするためにできることはあまりない可能性があるため、代わりに事前にロードしてください。[dic valueForKey:TUTORIAL_IMAGE]すべての画像を読み込んで、同じキーを使用して辞書に入れることができます。次に、辞書から(すでにロードされている)画像の1つにtableView:didSelectRowAtIndexPath:設定できます。_tutorialImageView.image

于 2013-03-25T06:23:11.860 に答える
0

おそらく画像読み込みコードです。ここで 2 つの提案があります。

a. 画像が多すぎない場合は、それらをすべてロードして、たとえば NSArray にキャッシュすることができます。

b. メモリが問題になる場合は、最初にプレースホルダー イメージや UIActivityIndi​​cator を表示してから、メイン スレッドから離れた別のスレッドでメイン イメージを読み込むことをお勧めします。

于 2013-03-25T07:43:07.780 に答える