2009-08-03 2 views
0

私は自分のアプリケーションのいくつかの設定に使用しているテーブルビューを持っています。表のセルはすべてデフォルトです(カスタマイズはまったくありません)。ラベルのテキストとアクセサリビューのUISwitchが含まれています。UITableCells内でのUISwitchの参照

私の問題は、スイッチのオンとオフがいつ切り替わるかを知るために、スイッチへの参照が必要なことです。

現在、スイッチの「タグ」プロパティを、テーブル内のセルのインデックスのプロパティに設定しています(tableViewの[indexPath row]から取得しました:cellForRowAtIndexpath :)。

テーブルにセクションが1つしかない場合でもこれは問題ありませんが、今は新しいセクションを追加しています。問題は両方とも0ベースのインデックスが付けられているため、各セクションのスイッチがタグを再利用することになります。これはうまくいきません。

これを達成するためのより良い方法に関する提案はありますか?おかげさまで

+0

スイッチを変更するためのイベントハンドラ(IBAction)がありますか?私はそこに 'sender'パラメータを使うことができると思います。 – pgb

答えて

2

を持っているオハイオ州のように、と言う場合を知っていると仮定しますセクションごとに100万行以上のセクションと行をハッシュする:

const int oneMillion = 1000000; 

int tag = (section * oneMillion) + row; 
slider.tag = tag; 

そして、セクションと行を把握するために、論理反転:テーブルの

int tag = slider.tag; 
int row = tag % oneMillion; 
int section = tag/oneMillion; 
NSIndexPath *indexPath = [NSIndexPath indexPathForRow: row inSection: section]; 

すぐそのセクション内のセルにあるスライダーを得る、行を

UITableViewCell *sliderCell = [tableView cellForRowAtIndexPath: indexPath]; 
UISlider *slider = [[sliderCell.contentView subviews] objectAtIndex: 0]; 

これは、スライダが常にセルの内容の唯一のビューであることを前提としています。

このメソッドは、上記の他のいくつかの提案よりも少し長くなりますが、サイドに参照をキャッシュする必要がありません。

0

セルごとに、デリゲートリンクをテーブルビューコントローラに戻し、何らかの行参照IDを設定してから、スイッチをセルIBActionメソッドに接続します。このメソッドは、参照IDを持つデリゲートをコールバックします細胞。

0

あなたができることは、配列の配列または辞書を持っているか、セクション番号でキー入力するか(セクション番号の順に配列されます)、スイッチ全体を検索しますあなたはセクションと行番号

UISwitch *switch=[[switchArray objectAtIndex:section] objectAtIndex:row]; 

またはあなたがより多くのではなく、あなたが持っているだろう大体どのように多くのセクションと行を知っている場合は、辞書

UISwitch *switch=[[switchDictionary objectForKey:section] objectAtIndex:row]; 
関連する問題