質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.23%

【Swift】Table Viewで現在表示中のセルのindex番号取得方法

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,302

ishicoro

score 24

Table View(Collection View)に関することでご助言頂けますと幸いです。

●実現したいこと:
Collection Viewにて、現在表示されているセルのindex番号を取得したいです。

●試したこと:
カスタムクラスは合計で7個のセルが入っており、1画面に1セルしか表示させない作りになっています。
[will display cell]を使って上記の実現したいことを実施しようとしました。

    func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {



        if let cell = cell as? ImageCollectionViewCell {

            self.visibleIndexNumber = indexPath.row //別箇所で使用
        }

        print(indexPath.row)

    }

●問題:
Collection Viewで左から右に向かって順番にスクロールしていくと、
print(indexPath.row)の出力も0から始まって1ずつ増えていき、最後は6が出力され、やりたいことが実現できています。ですが、そのあと左に向かってスクロールして戻っていくと、途中で一気に2つ分戻ったりします。

◇パターン1
・右に向かうとき:0,1,2,3,4,5,6
・左に戻るとき :6,4,3,2,1,0,0 

◇パターン2
・右に向かうとき:0,1,2,3
.左に戻るとき   :3,1,0,0

必ず、最初に戻るタイミングで、1個分のセルしか戻っていないにもかからわず、
indexPath.rowの出力は2個分マイナスされてしまいます。

以上になります。お手数ですが、お力添え頂けますと幸いです。。。
よろしくお願いいたします。

★以下補足★
indexPathの使用目的を記載します。

スマホを耳元に持ってきた時に(iPhone上部の近接センサーが反応した時に)、
現在表示されているセル内の音源を自動再生させたいです。
そのため、取得したindexPathが配列内で何番目に当たるかを知る必要があります。。。!

    @objc func proximitySensorStateChanged(){


        if (UIDevice.current.proximityState == true) {

            let message = messages[self.visibleIndexNumber] 

                let audioUrl = URL(string: message.url!)
                URLSession.shared.dataTask(with: audioUrl!, completionHandler: { (data, response, error) in

                    DispatchQueue.global().async{
                        DispatchQueue.main.async{

                            do {
                                self.audioPlayer =  try AVAudioPlayer(data:data!)
                                self.audioPlayer.delegate = self
                                self.audioPlayer.play()
                            }

                            catch{}
                        }
                    }

                }).resume()

            } catch {

            }

        } else {

        }

    }
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

使用するところで使用するときに、indexPathForVisibleItemで捕まえてあげる方法はどうでしょうか?

アップルさん

完全に表示されているかどうかとかを勘案すると一工夫必要かもしれませんが。
完全に表示されているセルを取得

補足

取得したインデックスパスをどこで何につかうかわからんのですが、ソッチのほうが重要な気がします。

とりあえず、indexPathForVisibleItems

// ボタンをタップしたときに画面に表示されているセルのインデクスパス配列をコンソールに表示する
@IBAction func printItemIndexPathArray(_ sender: UIButton) {
    let indexPathArray = testCollectionView.indexPathsForVisibleItems
    print(indexPathArray)
}


こんなかんじで任意のタイミングでインデックスパスを取得することはできると思います。
willDisplayのほうは申し訳ないですがわかりませ〜ん。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/02 16:33

    tyobigorouさん
    すみません、ありがとうございます。
    取り出せましたが、willdisplaycellの時と同じ現象が起こってしまいました。
    一旦根本からコードを見直してみます。ありがとうございました!

    キャンセル

  • 2019/06/03 13:43 編集

    解決済みになってますが、選択されたセルに対応する音をならしたいということだと思われますので、
    didSelectItem内で、タップされたセルのインデックスパスを取得して、タップされたセルを明示、任意の場所にスクロール(選択されていることがわかりやすいように)、その後任意のタイミングで使うのがよいのではないのでしょうか?

    キャンセル

  • 2019/06/09 16:00

    tyobigorouさん
    遅れましてすみません。追加コメントありがとうございます。
    選択したセルの音源を再生するコードは実はすでに実装済でして、問題なく動きます。
    今回やりたかったことは、それに加えて、わざわざセルを押さなくても、スマホを耳に持ってくるだけで自動再生されるという機能でした。

    ご教示いただきましたindexPathForVisibleItems.first.rowで、まだ正しいセル番号を取得できず異なる音源が流れてしまうのは、おそらく完全に表示されているセル以外も取得してしまったり、ズレが生じているからだと思います。その影響もあってか、2つの音源が同時再生されたりもします。

    最初に貼って頂いたリンク先のperfectvisiblecellsも使ってみましたが、
    perfectvisiblecellsのindexpath取得方法がわからず... といった状況です。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.23%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る