1

カスタム UITableViewCell (このように) が取り込まれたテーブル ビューを作成しました。各セルには 2 つの UIButton が含まれています。次のようにアクションをボタンに割り当てます。

 [decreaseButton addTarget:self action:@selector(decrease) forControlEvents:UIControlEventTouchUpInside];

これは正しい方法ですか?とにかく、それは機能しますが、私の「減少」メソッドでは、ボタンが押されたテーブル ビューの 18 行のどれかを知る必要があります。もちろん、 indexPath.row は cellForRowAtIndexPath メソッドの外では機能しません。誰かがこれを行う方法を説明できますか?

よろしくお願いします!

イヤシン

4

2 に答える 2

3

これには 2 つの方法があります。

イベント送信者の検査

減少方法を次のように変更します。

- (void)decrease;

に:

- (void)decrease:(id)sender;

そうすれば、reduce が呼び出されたときに、イベント内で修正されたボタンへの参照が与えられます。

より情報に近い減少方法を定義する

もう 1 つの解決策は、ボタンごとに異なるターゲット インスタンスを用意することです (たとえば、カスタム セルの一部として減少関数を実装します)。そうすれば、タッチされたボタンが現在のセルのボタンであることがわかります。

于 2009-11-10T19:23:03.680 に答える
1

これを解決する方法は、カスタム セル オブジェクト内で必要なデータを追跡することです。そして、ボタンは外部レシーバーではなくセル自体に接続され、アクションの実際のレシーバーを呼び出す方法を順番に知っています。

次のようなものでセルを作成します。

cell = [[MyTableViewCell alloc] initWithStyle:style 
                              reuseIdentifier:CellIdentifier];

そして、デキュー時にセルを再初期化できるように、セットアップ メソッドがあります。

[cell setupMyCellWithContext:objectID 
                      target:[[UIApplication sharedApplication] delegate] 
                      action:@selector(someAction)];

したがって、cell クラス内で、setup メソッドで送信されたアクションとターゲットを使用して、真のターゲットを呼び出します。

- (void)doAction:(id)sender {
    if ([target respondsToSelector:action]) {
        [target performSelector:action withObject:objectID afterDelay:0];
    }
}

したがって、ユーザーがボタンをタップすると、OS は [cell doAction:] を呼び出します。これは、正しいコンテキスト オブジェクトを使用して、事前に設定したターゲットとアクション セレクターを呼び出します。

于 2009-11-11T01:57:38.470 に答える