こんにちは。開発担当のICTFです。
今回はカスタマイズしたUITableViewCell(サンプルとしてUISwitchを加えたもの)をUITableViewに追加した場合の、セル上にあるスイッチが切り替わった事をTableView側で感知する方法をご紹介しようと思います。
まずこのようなカスタマイズUITableViewCellを作ります。
カスタマイズしたUITableViewクラスの名称は、「SwitchCell」とします。
SwitchCellクラスのヘッダファイルは次のようになります。
@protocol SwitchCellDelegate
// スイッチの切換えを通知する
-(void) tableView:(UITableView*)tableView changeSwitchValue:(BOOL)on indexPath:(NSIndexPath*)indexPath;
@end
@interface SwitchCell : UITableViewCell
{
id _delegate;
}
@property (nonatomic, assign) id<SwitchCellDelegate> Delegate;
@property (nonatomic, retain) IBOutlet UISwitch* ValueSwitch;
@property (nonatomic, retain) IBOutlet UILabel* Title;
// スイッチの値が変更されたときのコールバック
-(IBAction) changeSwithValue:(id)sender;
@end
InterfaceBuilderでセルの設計を行なった場合、セル上に配置した各オブジェクトをプロパティに関連づけてください。
例ではUISwitchをValueSwitchに関連づけました。
次に、スイッチを切換えた時にコールするデリゲートメソッドをプロトコルとして実装します。
プロトコル名は「SwitchCellDelegate」、デリゲートメソッドは「-(void) tableView: changeSwitchValue: IndexPath」としました。
デリゲートとしてコールする事になりますので、SwitchCellクラスにデリゲートを保持する為の変数を追加する必要があります。
メンバ変数に_delegate、_delegateに関連づけるプロパティを追加しています。
実際にスイッチが切換えられた時にコールされるメソッドが「-(IBAction) changeSwitchValue:」です。
changeSwitchValueの実装は次のようになります。
// スイッチの値が変更されたときのコールバック
-(IBAction) changeSwithValue:(id)sender
{
// スーパークラスをたどり、このセルを保持するテーブルビューを探す
id tableView = [sender superview];
while ([tableView isKindOfClass:[UITableView class]] == NO) {
tableView = [tableView superview];
}
// NSIndexPathを得る
NSIndexPath* indexPath = [((UITableView*)tableView) indexPathForCell:self];
// デリゲートメソッドをコールする
[_delegate tableView:tableView changeSwitchValue:self.ValueSwitch.on indexPath:indexPath];
}
引数に自身が配置されているUITableViewと、自身を指すNSIndexPathを設定する必要があります。
UITableViewは自身の親となるビュークラスを辿ってゆき、UITableViewを見つけています。
見つけたUITableViewのindexPathForCellメソッドを用い、自身のNSIndexPathを取得します。
後はデリゲートメソッドをコールすれば、SwitchCellとしての役割は終了です。
次にSwitchCellを表示するUITableViewを保持するクラスに対し、修正を加えます。
例ではUITableViewControllerを継承した「SCR_MNU_005_SettingIndex」というクラスで紹介します。
先ほど作成したSwitchCellDelegateを採用します。
@interface SCR_MNU_005_SettingIndex : UITableViewController
<SwitchCellDelegate>
{
...
}
デリゲートとしてSCR_MNU_005_SettingIndexを登録する必要がありますので、SwitchCellを生成する箇所(恐らく- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath内になると思います)に以下の処理を追加します。
最後に実際に受け取るデリゲートメソッドの実装を行ないます。
-(void) tableView:(UITableView *)tableView changeSwitchValue:(BOOL)on indexPath:(NSIndexPath *)indexPath
{
CategoryInfo* category = [_categoryList objectAtIndex:indexPath.section];
CellInfo* cellInfo = [category.CellList objectAtIndex:indexPath.row];
NSLog(@"ログ表示: [%@]", on?@"ON":@"OFF");
}
CategoryInfoとCellInfoクラスについて詳しい紹介は省きますが、データソースを管理するクラスです。
indexPathから該当するデータソースを抽出し、通常のコールバックメソッド同様、様々な処理を行なう事が可能です。
同じ作り方でUIButtonやUISliderのイベントを感知する事ができますので、応用してみて下さい。
コメントする