1. ホーム
  2. ios

[解決済み] ある要素がアクティブになったときにindexpath.rowを取得するには?

2022-05-16 15:51:07

質問

ボタン付きのテーブルビューがあり、そのうちの1つがタップされたときにindexpath.rowを使用したいと思います。 これは私が現在持っているものですが、それは常に0です。

var point = Int()
func buttonPressed(sender: AnyObject) {
    let pointInTable: CGPoint =         sender.convertPoint(sender.bounds.origin, toView: self.tableView)
    let cellIndexPath = self.tableView.indexPathForRowAtPoint(pointInTable)
    println(cellIndexPath)
    point = cellIndexPath!.row
    println(point)
}

どのように解決するのですか?

giorashc はもう少しで答えを見つけられそうでしたが、彼はセルが余分な contentView 層があるという事実を見落としていました。したがって、私たちはさらに1層深く進まなければならないのです。

guard let cell = sender.superview?.superview as? YourCellClassHere else {
    return // or fatalError() or whatever
}

let indexPath = itemTable.indexPath(for: cell)

これは、ビュー階層内で、tableViewはセルをサブビューとして持っており、その後、独自の'コンテンツビュー'を持っているため、セル自体を取得するために、このコンテンツビューのスーパービューを取得する必要があるためです。この結果、もしボタンがセルのコンテンツビューに直接ではなく、サブビューに含まれている場合、それにアクセスするために何層か深く移動する必要があります。

上記はそのようなアプローチの1つですが、必ずしも最良のアプローチではありません。機能的である一方で、これは UITableViewCell について、Apple が必ずしも文書化していない詳細、例えばビュー階層を想定しています。これは将来変更される可能性があり、上記のコードは結果として予測不可能な動作をする可能性があります。

上記の結果、長寿と信頼性の理由から、私は別のアプローチを採用することをお勧めします。このスレッドには多くの代替案が記載されており、下まで読むことをお勧めしますが、私の個人的なお気に入りは次のとおりです。

セル クラスのクロージャのプロパティを保持し、ボタンのアクション メソッドでこれを呼び出すようにします。

class MyCell: UITableViewCell {
    var button: UIButton!

    var buttonAction: ((Any) -> Void)?

    @objc func buttonPressed(sender: Any) {
        self.buttonAction?(sender)
    }
}

そして、セルを作成する際に cellForRowAtIndexPath でセルを作成すると、クロージャに値を割り当てることができます。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell") as! MyCell
    cell.buttonAction = { sender in
        // Do whatever you want from your button here.
    }
    // OR
    cell.buttonAction = buttonPressed(closure: buttonAction, indexPath: indexPath) // <- Method on the view controller to handle button presses.
}

ハンドラのコードをここに移動することで、すでに存在する indexPath 引数を利用することができます。これは、文書化されていない特徴に依存しないので、上記のものよりはるかに安全なアプローチです。