[解決済み] ある要素がアクティブになったときにindexpath.rowを取得するには?
質問
ボタン付きのテーブルビューがあり、そのうちの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
引数を利用することができます。これは、文書化されていない特徴に依存しないので、上記のものよりはるかに安全なアプローチです。
関連
-
[解決済み] キーボードがあるときに、UITextFieldを編集開始時に上に移動させるには?
-
[解決済み] UITableViewの選択を無効にするにはどうすればよいですか?
-
[解決済み] 文字列の長さを取得する
-
[解決済み] iOS7でスタイルUITableViewStyleGroupedを持つUITableViewの上部に余分なパディングがあるのはなぜですか?
-
[解決済み] フレームワークを使用したiOSアプリがデバイス上でクラッシュ、dyld: ライブラリがロードされない、Xcode 6 Beta
-
[解決済み] UIViewの左上と右上だけにcornerRadiusを設定する方法は?
-
[解決済み] Swiftを使用してアプリのバージョンとビルド番号を取得するにはどうすればよいですか?
-
[解決済み] iphoneアプリのベータテストはどのように行うのですか?
-
[解決済み] iOS 7でステータスバーとナビゲーションバーがビューの境界を越えて表示される
-
[解決済み] iOS 11、Apple TV 4Kなどを搭載したXcode 9でワイヤレスデバッグを行う方法とは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
制御が非ボイド関数の終了に達する
-
EXC_BAD_ACCESS (code=2, address=0x0)
-
[解決済み] App Storeのアプリと連動させる方法
-
[解決済み] Objective-CでNSNotificationCenterを通してメッセージを送受信する?
-
[解決済み] テキストフィールドを移動する方法(次へボタン/完了ボタン)
-
[解決済み] Swiftを使用してアプリのバージョンとビルド番号を取得するにはどうすればよいですか?
-
[解決済み] アプリのプレビュー用にiOSシミュレータのビデオをキャプチャー
-
[解決済み] UITextFieldのテキストインセット?
-
[解決済み] Swift で HTTP リクエストを行うにはどうしたらいいですか?
-
[解決済み] Swiftの配列を文字列に変換するには?