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

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

新規登録して質問してみよう
ただいま回答率
85.48%
TableView

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

7027閲覧

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

ishiishiyay

総合スコア33

TableView

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

1クリップ

投稿2019/06/01 08:06

編集2019/06/01 15:25

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

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

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

Swift

1 func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) { 2 3 4 5 if let cell = cell as? ImageCollectionViewCell { 6 7 self.visibleIndexNumber = indexPath.row //別箇所で使用 8 } 9 10 print(indexPath.row) 11 12 }

●問題:
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が配列内で何番目に当たるかを知る必要があります。。。!

Swift

1 2 @objc func proximitySensorStateChanged(){ 3 4 5 if (UIDevice.current.proximityState == true) { 6 7 let message = messages[self.visibleIndexNumber] 8 9 let audioUrl = URL(string: message.url!) 10 URLSession.shared.dataTask(with: audioUrl!, completionHandler: { (data, response, error) in 11 12 DispatchQueue.global().async{ 13 DispatchQueue.main.async{ 14 15 do { 16 self.audioPlayer = try AVAudioPlayer(data:data!) 17 self.audioPlayer.delegate = self 18 self.audioPlayer.play() 19 } 20 21 catch{} 22 } 23 } 24 25 }).resume() 26 27 } catch { 28 29 } 30 31 } else { 32 33 } 34 35 }

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

アップルさん

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

補足

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

とりあえず、indexPathForVisibleItems

swift

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

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

投稿2019/06/01 10:08

編集2019/06/01 15:02
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ishiishiyay

2019/06/01 13:23

tyobigorouさん コメントありがとうございます! 実は最初にindexPathForVisibleItemも試みたのですが、数字の取得方法がわからずに、今のwilldisplaycellの方法に行き着いたという背景がありました・・・。 viewDidAppear内に以下を書いた時に、 let number = myCollectionView?.indexPathsForVisibleItems.first?.row print(number)でカスタムクラスの配列の最初のセルのindedx番号0が出力されましたが、 最初の一度しか発動されないがゆえに、collectionViewをスクロールして次のセルに移っても、何も起こりませんでした。 また別で、以下の方法で配列番号の取得も検討しましたが、自分のカスタムクラスの構造上、該当セルを取得するための検索キーがわからず断念し。。。 https://teratail.com/questions/128419 お手数ですが、引き続きご助言頂けますと幸いでございます。
ishiishiyay

2019/06/01 15:27

tyobigorouさん お返事ありがとうございます! ご記載いただいた、indexPathArrayの番号はどのように取得できますでしょうか? (元の質問を編集し、使用目的を記載させていただきました!)
退会済みユーザー

退会済みユーザー

2019/06/01 16:23

?? indexPathArrayの番号?? [IndexPath]?なので、配列からお好きな順番のindexPathをとりだして、お好きなsectioかrowだと思いますが?? 最初ならfirst?、とか[0]で取り出せばよいのでは?
ishiishiyay

2019/06/02 07:33

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

退会済みユーザー

2019/06/03 04:45 編集

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

2019/06/09 07:00

tyobigorouさん 遅れましてすみません。追加コメントありがとうございます。 選択したセルの音源を再生するコードは実はすでに実装済でして、問題なく動きます。 今回やりたかったことは、それに加えて、わざわざセルを押さなくても、スマホを耳に持ってくるだけで自動再生されるという機能でした。 ご教示いただきましたindexPathForVisibleItems.first.rowで、まだ正しいセル番号を取得できず異なる音源が流れてしまうのは、おそらく完全に表示されているセル以外も取得してしまったり、ズレが生じているからだと思います。その影響もあってか、2つの音源が同時再生されたりもします。 最初に貼って頂いたリンク先のperfectvisiblecellsも使ってみましたが、 perfectvisiblecellsのindexpath取得方法がわからず... といった状況です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問