技術はメシのタネ

底辺プログラマで技術の向上を目指しているけれどやりたい事が無くて困っている

カスタムセルに設置したUISwitchのindexPathを取得する

qiita.com

シンプルなカスタムセルの作り方とセル内のボタンへのイベント設定方法 | Technology-Gym

↑参考サイト

な・ん・で !
ボタンだと簡単に何番目のセルかわかるのにスイッチだとわからんかな!

テーブルビューでカスタムセルにスイッチをくっつけた。
上記参考サイトの真似をしてon/off切り替わったセルが何番目なのか知ろうとしたらXcodeストライキ始めた。

addTargetUISwitchactionメソッド設定する時に、引数に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だから同じ手法でうまくいくと思うよ?

以上。