カスタムセルに設置したUISwitchのindexPathを取得する
シンプルなカスタムセルの作り方とセル内のボタンへのイベント設定方法 | Technology-Gym
↑参考サイト
な・ん・で !
ボタンだと簡単に何番目のセルかわかるのにスイッチだとわからんかな!
テーブルビューでカスタムセルにスイッチをくっつけた。
上記参考サイトの真似をしてon/off
切り替わったセルが何番目なのか知ろうとしたらXcodeがストライキ始めた。
addTarget
でUISwitch
にaction
メソッド設定する時に、引数にUIEvent
取るようにしても、実際にメソッド呼ばれた時にはevent
の中身が空っぽなので、何番目のセルに触っているかわかりませーん。
ってことらしい。
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! CustomCell let object = objects[indexPath.row] as! NSDate cell.textLabel!.text = object.description cell.customSwitch.addTarget(self, action: Selector("handleTouchSwitch:event:"), forControlEvents: UIControlEvents.ValueChanged) return cell }
extension TableViewController { func handleTouchSwitch(sender: UISwitch, event: UIEvent){ let indexPath = self.indexPathForControlEvent(event) let object = objects[indexPath.row] as! NSDate println(object) } func indexPathForControlEvent(event: UIEvent) -> NSIndexPath { let touch = event.allTouches()?.first as! UITouch let point = touch.locationInView(self.tableView) let indexPath = self.tableView.indexPathForRowAtPoint(point) return indexPath! } }
Stack Overflow
とか見ると、sender.superview
がセルで、cell.superview
がテーブルだから、っていう手法が紹介されてるんだけど、上手くいかない。
superview
をキャストしたところでUIView
はセルになれないから!
ハハッ!
とXcodeに言われた(ような気がする)。
仕方ないのでUISwitch
について調べたら、いいプロパティ発見。
これで何番目のセルかわかる。
追記:
わかりませんでした……orz
下記ソースでは何番目のセルを選んだかわかりません。
何番目のセルを選んでも同じ座標を示すCGPoint
を取得してしまいます。
ちゃんと何番目のセルを選んだかがわかるソースはこちらの記事で。
techmeganeyamada.hatenadiary.com
追記:下記ソースは間違い
func handleTouchSwitch(sender: UISwitch) { let point: CGPoint = sender.layer.position let indexPath = self.tableView.indexPathForRowAtPoint(point) let object = objects[indexPath!.row] as! NSDate println(object) }
たまにはググるより、ctrl
+cmd
+j
の方が役立つこともある。
……てかたぶんだけど、ボタンもUIView
だから同じ手法でうまくいくと思うよ?
以上。