1. ホーム
  2. ios

[解決済み] UITableViewCellのaccessoryViewにカスタム画像を使用し、UITableViewDelegateに応答させる。

2022-05-17 10:03:01

質問

私はカスタムで描画されたUITableViewCellを使用しています。 accessoryView . アクセサリビューのための私の設定は、次のような方法で発生します。

UIImage *accessoryImage = [UIImage imageNamed:@"accessoryDisclosure.png"];
UIImageView *accImageView = [[UIImageView alloc] initWithImage:accessoryImage];
accImageView.userInteractionEnabled = YES;
[accImageView setFrame:CGRectMake(0, 0, 28.0, 28.0)];
self.accessoryView = accImageView;
[accImageView release];

また、セルが初期化される際にも initWithFrame:reuseIdentifier: というプロパティを設定するようにしました。

self.userInteractionEnabled = YES;

残念ながら、私のUITableViewDelegateでは、私の tableView:accessoryButtonTappedForRowWithIndexPath: メソッド(これを10回繰り返してみてください)がトリガーされないのです。デリゲートは間違いなく適切に配線されています。

何が足りないのでしょうか?

皆さん、ありがとうございます。

どのように解決するのですか?

悲しいことに、そのメソッドは、定義済みのタイプのいずれかを使用するときに提供される内部ボタンタイプがタップされない限り、呼び出されません。独自のものを使うには、アクセサリをボタンや他のUIControlのサブクラスとして作成する必要があります(私は -buttonWithType:UIButtonTypeCustom を使用して、UIImageViewを使用するのではなく、ボタンの画像を設定することをお勧めします)。

これは、標準のウィジェットを十分にカスタマイズしています(私たちのティールカラーに合わせるために、ほんの少し)。

まず、この関数は、私たちのカスタムグラフィックを使用して、新しい詳細開示ボタンを返します。

- (UIButton *) makeDetailDisclosureButton
{
    UIButton * button = [UIButton outpostDetailDisclosureButton];

[button addTarget: self
               action: @selector(accessoryButtonTapped:withEvent:)
     forControlEvents: UIControlEventTouchUpInside];

    return ( button );
}

ボタンが終了するとこのルーチンが呼び出され、アクセサリボタン用の標準的なUITableViewDelegateルーチンにフィードされます。

- (void) accessoryButtonTapped: (UIControl *) button withEvent: (UIEvent *) event
{
    NSIndexPath * indexPath = [self.tableView indexPathForRowAtPoint: [[[event touchesForView: button] anyObject] locationInView: self.tableView]];
    if ( indexPath == nil )
        return;

    [self.tableView.delegate tableView: self.tableView accessoryButtonTappedForRowWithIndexPath: indexPath];
}

この関数は、ボタンから提供されるイベントからタッチのテーブルビュー内の位置を取得し、その時点の行のインデックスパスをテーブルビューに問い合わせることで行の位置を特定します。