1

面白いシナリオがあります。ボタンを含むカスタム TableViewCell クラスがあります。私がやりたいことは、カスタム セル クラス内のボタンのタッチ イベントをキャッチし、コンテナー コントロール (ler) が処理する新しいイベントをスローすることです。

この理由は、「アーカイブ」とマークされたボタンのあるセルがあるためです。カスタム TableViewController でセル コードを処理する代わりに、アーカイブ ボタンを非表示にしてコンテナ コントロール (または TableViewController) に「セル X でアーカイブ イベントが発生しました」を処理するように指示する必要があるため、最初にボタン呼び出しをインターセプトします。セル内で何が起こっているかをコントローラーに知られたくありません。そうすれば、再利用可能でクリーンなコードが得られます。

したがって、コントローラーはイベントを受信し、イベントを形成して、削除する必要があるレコードを知るために、どのセルが関与しているかを判断できる必要があります。NSNotificationCenter クラスでこれを実現し、オブザーバーに面倒を見てもらうことができますが、代わりにイベントとして発生させることができれば、それは素晴らしいことです (同意するかどうかはわかりません)。

これは iOS 開発で実現できますか?

私の質問が理にかなっていることを願っています。

ありがとう

編集:誤解されているようです。したがって、明確にさせてください (これがまったく不可能でない限り)、セル内のボタンについて TableViewController に認識させたくありません。コントローラーは、セルによって生成されたイベントを受信する必要があります。これは、元のボタン タッチ イベントをキャッチし、そこから、コントローラーがキャッチできる新しいイベントをセル内で生成する必要があるためです。.NET の世界でできることと同様です。ただし、これができない場合はお知らせください。その理由は、よりクリーンで再利用可能なコードのためです。

4

3 に答える 3

1

カスタム テーブル ビュー セルを作成するときに、コールバックをボタン プレス イベントにアタッチできます。これで、インデックスをボタンのタグとして渡し、uitableview コントローラーのデータ ソースからアイテムを削除できます。

テーブルビューをリロードすると準備完了です。

これがお役に立てば幸いです。

myCell.archiveButton.tag = indexPath.row ; // This is the index in your data source

[myCell.archiveButton addTarget:self action:@selector(archiveItems:) forControlEvents: UIControlEventTouchUpInside];

void archiveItems:(id)sender {
    int index = sender.tag;
// Remove the item from your data source

[self.myTableview reloadData];

}
于 2012-07-03T12:34:02.717 に答える
0

誰かが私にもっと良い方法を教えてくれない限り、私はこのアプローチを採用します。

TableViewController があるとします。

@interface CustomViewController : UITableViewController<ArchiveItemDelegate> ...

カスタムTableViewCellがあります:

@interface CustomCell : UITableViewCell ...

以下のデリゲート プロトコルを使用してデリゲート プロパティを使用します。

今、私はプロトコルを作成しました:

@protocol ArchiveItemDelegate <NSObject>

-(void)archiveActionPerformed:(CustomCellData *)cellData onCell:(CustomCell *)cell;

@end

CustomCell 実装内で、アーカイブ ボタンにイベント リスナーをアタッチします。

- (void)archiveButtonPressed:(UIButton *) sender forEvent:(UIEvent *)event {
    [self.delegate archiveActionPerformed:currentCellData onCell:self];
}

今私の TableViewController では、 ArchiveItemDelegate プロトコルから「継承」して実装します。

-(void)archiveActionPerformed:(CustomCellData *)cellData onCell:(CustomCell *)cell {
    // do whatever ...
}

「tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath」メソッドで、TableViewController をセルにアタッチするだけです。

cell.delegate = self;

これで、TableViewController はセルの内部を認識せず、アーカイブ ボタンがタップされると、セルは「アーカイブ イベント」を通知します。これは少し「進化」するかもしれませんが、今のところそうなると思います。誰かがより良い解決策を持っている場合は、私に知らせてください。私が .NET 空間から来たことがわかります ;-)

于 2012-07-04T07:09:19.337 に答える
0

はい、できます。

まず、そのボタンにタグとして位置を設定する必要があります。次に、ViewController を Button のターゲットに設定し、このようなセレクター メソッドを呼び出します。

[yourCustomCell.yourButton setTag:indexPath.row];//set position as tag to remember the position
[yourCustomCell.yourButton addTarget:self action:@selector(doArchive:) forControlEvents:UIControlEventTouchUpInside];

次に、doArchiveメソッドでタグを取得します。これは、実際には次のような位置です。

- (void)doArchive:(id)sender
{    
    int positon = sender.tag;
    // do something with positon and get the data from your Array at that position
}
于 2012-07-03T12:36:42.597 に答える