こんにちは。富家(
@fm_tonakai)です。
よく設定画面などでデーブルセルにボタンやスイッチ、セグメントコントロールなど置く時があると思います。
こういう時、それぞれのコントロールにaddTargetすると、TableViewの挙動でreuseされた時など、
いちいち一度removeTargetしてまたaddTargetしてなどいろいろめんどくさいです。
そこでもっと良い方法がないか考えて自分はこのようにしています。
テーブルセルは基本的にはセル全体が押せることが前提になっているように思いますが、いくつかの設定の中で標準で別ボタンがおける設定があります。
UITableViewCellAccessoryDetailDisclosureButtonです。
この設定をするとセルの右側に押せるボタンが表示されます。
そしてこのボタンが押されたときは、デリゲートの-tableView:accessoryButtonTappedForRowWithIndexPath: メソッドが呼ばれます。
そこで、自作したコントロールのアクションもこのようにデリゲートの中で処理出来ればよいのではないかと思いました。
UITableViewDelegateプロトコルに自作のメソッド定義を追加するイメージです。
必要なのはそのコントロールを持つセルが表示されているテーブルビューとセル自身のindexPathですが、
どちらも標準のAPIには取得するメソッドはないのでカテゴリで自作します。
次にdelegateに追加するメソッドを記述したプロトコルを作成します。プロトコル名の後に
をつけることでプロトコルを継承することができます。
とりあえず例としてaccessoryViewにUISwitchをつけたセルを作ることにします。
cell自身を追加したUISwitchのターゲットにしてしまい、ターゲットメソッドの中で
上記カテゴリを用いてdelegateの自作メソッドを呼び出します。
あとは追加したメソッドを実装します。 addTargetやremoveTargetなど、cellの中身のコントロールについては直接触ること無く動作を実装することができるようになったかなと思います。
とりあえず作っておけばセルの再利用もしやすいですね!
というわけでCell内のコントロールのアクションはdelegate任せにすると楽じゃないかなというお話でした!