【Swift3】UICollectionViewで「Assertion Failure in [UICollectionViewData:invalidateItemsPaths] ~~」が出た時の対処

どうも。Reoです。

UICollectionViewで謎のエラーが出たのでその対処メモです。

iOS11だとちゃんと動くのに、iOS10だとクラッシュするというよくわからんエラーです。

Assertion failure in -[UICollectionViewData invalidateItemsAtIndexPaths:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3600.7.47/UICollectionViewData.m:150

というエラーです。

 

UICollectionViewのサブクラスを使っていて、それを初期化する際に2つのレイアウトからどちらを使うかで場合分けをしていたんですが、そこで発生しました。

私の実装も悪そうなんですが、

「CustomCollectionView初期化」→「レイアウトを変えるために一度nilにする」→「もう一度CustomCollectionView初期化」

という処理で、2回目のlayoutSubviewsのところで落ちます。

UICollectionViewFlowLayout自体を違うものを使用して初期化しようとしているんですが、それが悪いのか・・・。

 

とりあえず解決策

2回目のレイアウトがされる前に

// self = CustomCollectionView()
self.collectionViewLayout.invalidateLayout()

を呼び出してやれば解決しました。

レイアウトの再計算が必要なときには、この処理が必要らしいんですが、そもそもinitを書き直して作り直しているのに再計算?って感じなんですが、でもこれがあれば落ちないのでおkにしました。

私の場合ではinitの中に書いておけばちゃんと動きました。

 

iOS11ではなくてもちゃんと動くのにな〜。よくわからんけど解決万歳。

 

Assertion failure~の部分をコピペして検索しても全くヒットしなかったんで、数件ヒットした中の中国語の記事で解決。流石に文章は全く読めないんですけどねwww

Assertion failure in -[UICollectionViewData validateLayoutInRect:], – sun island的博客 – CSDN博客

 

ありがたや。プログラムは国境を越えるで・・・

 

 

Comments...

コメントは認証制です。詳しくは下記の注意をお読みください。お気軽にコメントお願いします!

Write a Comment

コメント時の注意

「Twitter」「Facebook」「Google+」「WordPress」のいずれかのアカウントをお持ちの方は各アカウントと連携することでコメントできます。 コメントしたことはSNSに流れませんので、アカウントをお持ちの方はこちらの方法でコメントを投稿して下さると嬉しいです。 アカウントをお持ちでない方はメールアドレスで投稿することができます。 初回コメント時は承認後に表示されます。

Related Memo...

UINavigationController + UIScrollView の組み合わせで使っている時に謎の余白ができる時

UINavigationController + UIScrollView の組み合わせで使っていて、UIScrollView 上に AutoLayout で上下左右0で View を設置しているのに、30px程度上にずれてしまうとき。

`navigationController.navigationBar.isTranslucent = false` にすると直るかもしれない。

ScrollView上のコンテンツとNavigationBarの重なっているところが透過していたら多分これで直せるはず。

通常のターゲットではちゃんと動いているのに、iOSSnapshotTestCase を用いたテストでだけこの対応が必要なのよくわからないけれど。。。

iOS

記事を書くほどでもないけれどメモっておきたいこと

テスト投稿。

例えばiphone7 の画面サイズ

750 × 1334
半分375 × 667

iOS

UITableView.RowAnimation の .none はアニメーションするよ

UITableView.RowAnimation の .none はアニメーションがnoneなわけじゃなく、デフォルトの設定を使うよという意味らしい。

The inserted or deleted rows use the default animations.

なのでアニメーションしちゃう。今更の気づき。

 

iOS
more