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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

Q&A

解決済

1回答

2233閲覧

IndexPath.itemに対しマイナスの値を指定した時のiOS 11とiOS 12での挙動の違いについて

imaizume

総合スコア12

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

0グッド

0クリップ

投稿2018/12/03 05:55

前提・実現したいこと

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 周りでの変更や挙動についてご存知の方がいたらお聞きしたいです。
よろしくお願いします。

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

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

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

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

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

fuzzball

2018/12/03 06:19

適当なのでこちらで。負値はありえないので動作は不定ってことじゃないですか。個人的には負値を与えているのが気持ち悪いですが。
退会済みユーザー

退会済みユーザー

2018/12/05 17:05

仕様の範囲外のエラーや挙動について議論するのは無意味だと思います。
guest

回答1

0

自己解決

遅くなりましたがご回答ありがとうございました。
お二人がおっしゃるように、そもそもありえない値を渡している事自体がおかしいというのはおっしゃるとおりですし、そこに対しての正しい挙動の有無を議論してもしょうがないですね。

投稿2019/12/02 06:19

imaizume

総合スコア12

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問