0

私は、2 つの主な目的を果たすナビゲーション ベースの iPhone 専用アプリに取り組んでいます。テーブル ビュー セルがタップされたときのデフォルト アクション。ここで、同じデータに関連付けられたオプションの小さなセットを提供する必要があります。ただし、didSelectRowAtIndexPath: と accessoriesButtonTappedForRowAtIndexPath: の両方のメソッドが使用されることは明らかです。

したがって、私のオプションはダブルタップ方法を実装することのようです。追加オプションの小さなリストは、上記のテーブル行をダブルタップした後に (ご想像のとおり) 表示されます。または、できればタップ アンド ホールド方式を使用します。私が知る限り、SDK 4.0 ではタップ アンド ホールドが採用されているようです。ダブルタップ オプションを使用することにしましたが、少し問題があります。

何よりもまず、touchesBegan:withEvent: メソッドがまったく呼び出されていないようです。メソッド内に配置されたブレークポイントは、アプリケーションの実行中に呼び出されることはなく、テーブル ビューはメソッドを挿入する前とまったく同じように応答します (つまり、既定のアクションを実行します)。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *aTouch = [touches anyObject];
    if (aTouch.tapCount == 2) {
        [NSObject cancelPreviousPerformRequestsWithTarget:self];
    }
}

次に、実際にはシングルタップを処理する必要はありません。didSelectRowAtIndexPath: メソッドは、シングルタップを問題なく処理できます。ダブルタップは私が扱いたいファンキーなものです。答えには、「テーブルビューでシングルタップを処理し、touchesBegan: メソッドでダブルタップを処理することはできません。タッチ処理メソッドはそれらすべてを処理する必要があります。」というフレーズが含まれていると思います。

この問題を扱ったことのある方からのアドバイスをいただければ幸いです。前もって感謝します。

4

1 に答える 1

2

さて、頭をひっかき、小声でつぶやいた1週間の後、私は最終的に次の結論に達しました。私がやりたいことは、現在のバージョンのiPhone OSを使用して理論的には可能かもしれませんが、それを機能させるための努力は巨大なスケールになります。近い将来、iPhone OS 4 がどのようにリリースされるかを見て、私は 4.0 SDK 機能を使用して探している動作を実装することにしました。

具体的には、私が行ったことは次のとおりです。

// in my tableView:cellForRowAtIndexPath: method
static NSString *CellIdentifier = @"CustomCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
[[NSBundle mainBundle] loadNibNamed:@"TableViewCell" owner:self options:nil];
    cell = tvCell;
    self.tvCell = nil;
}
UILabel *label;
label = (UILabel*)[cell viewWithTag:1];
label.text = [NSString stringWithFormat:@"Main Label"];
label = (UILabel*)[cell viewWithTag:2];
label.text = [NSString stringWithFormat:@"Sub Label"];
UILongPressGestureRecognizer *recognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)];
[[cell viewWithTag:0] addGestureRecognizer:recognizer];
[recognizer release];
UIImage *theImage = [UIImage imageNamed:@"silhouette.png"];
UIImageView *pictureView = (UIImageView*)[cell viewWithTag:0];
pictureView.image = theImage;
return cell;

カスタム セル用に別の NIB ファイルを作成しました。これは、左端に imageView (連絡先の写真用) があり、中央に 2 つのラベル (大きなテキストのメイン ラベルと小さなテキストのサブラベル) を持つ単なる tableViewCell オブジェクトです。cellForRowAtIndexPath: メソッドは、必要に応じてこのカスタム セルを読み込み、セルに静的データを入力します (このコードを既存のアプリに組み込むと、明らかに変更されます)。ジェスチャ認識エンジン用の新しいメソッドを 1 つ実装するだけで済みました。

- (void)handleLongPress:(UILongPressGestureRecognizer*)sender {
NSLog(@"Long press detected.");
}

もちろん、これも実際に使ってみると肉付けされます。

取引全体が魅力のように機能します。セルをタップして保持すると、「長押しが検出されました」というログが起動され、通常のシングルタップでは、tableView:didSelectRowAtIndexPath: メソッドで同様の「短押しが検出されました」というログが起動されます。

これが誰かに役立つことを願っています。

于 2010-05-21T21:03:01.353 に答える