前提・実現したいこと
iOSアプリ(Swift)で標準の UICollectionView
を使った画面での話です。
OSはiOS 11.4と12.1で検証しています。
また手元ではシミュレーター上でのみで確認していますが、すでにプロダクションで全く同じ条件でのクラッシュが報告されているため実機でも発生しています。
メッセージをやりとりする画面のため、 JSQMessagesViewController で実装されています。
この中で scrollToItem
メソッドで指定位置まで画面をスクロールをさせている箇所があります。
swift
1self.collectionView!.scrollToItem( 2 at: IndexPath(item: itemIndex, section: 0), 3 at: UICollectionView.ScrollPosition.top, 4 animated: false 5)
発生している問題・エラーメッセージ
うち最初の引数である at: IndexPath(item: itemIndex, section: 0),
についてiOS 11の端末とiOS 12以降で、 item
にマイナスの値を指定した場合の挙動が異なります。
つまり以下のようなコードを実行した場合に
swift
1self.collectionView!.scrollToItem( 2 at: IndexPath(item: -1, section: 0), // itemをマイナスの値で指定する 3 at: UICollectionView.ScrollPosition.top, 4 animated: false 5)
- iOS12では特に落ちずに動くのに
- iOS 11.4で試したところクラッシュしてしまいます
当たり前ですが、iOS 11.4でも0未満の値を指定しなければクラッシュはしませんでした。
swift
1self.collectionView!.scrollToItem( 2 at: IndexPath(item: max(-1, 0), section: 0), // maxで0未満にしない 3 at: UICollectionView.ScrollPosition.top, 4 animated: false 5)
なお 大きすぎるインデックス(self.collectionView.count
以上のインデックス)を指定した場合はOSバージョンに関係なく NSInvalidArgumentException
で落ちます。
swift
1self.collectionView!.scrollToItem( 2 at: IndexPath(item: 100, section: 0), // self.collectionView.count = 3 とかの状態で 3 at: UICollectionView.ScrollPosition.top, 4 animated: false 5)
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'attempt to scroll to invalid index path: <NSIndexPath: 0x600000825360> {length = 2, path = 0 - 100}'
とりあえず対処法は分かったものの、言語仕様の変更や他の報告がなかったので、なんか気持ち悪いなと思い、もし IndexPath
周りでの変更や挙動についてご存知の方がいたらお聞きしたいです。
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー