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

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

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

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

2回答

1560閲覧

CollectionViewを任意のタイミングで更新したい

退会済みユーザー

退会済みユーザー

総合スコア0

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2020/07/10 03:00

編集2020/07/10 07:16

前提・実現したいこと

以下の2画面があります.
A画面:CollectionViewでCellの背景がgreenとBへのボタン
B画面:CollectionViewでCellの背景が各々違うものが3つ(赤・黄・青)

最初にA画面が開き,B画面へのボタンを押すと,B画面へ移動します.
B画面はモーダル?(全画面表示ではないもの)です.

ここから,
B画面を開いて,3色の内のどれかをタップしてA画面に戻ると
A画面のCellがそのタップした色に変わっているものを作成したいです.

そこで,
Aにて,①Bからcolorを受け取る(初期は緑) ②Cellを表示される際に背景をcolorに設定

Swift

1 func collectionView(_ collectionView: UICollectionView, 2 cellForItemAt indexPath: IndexPath) -> UICollectionViewCell{ 3 let cell:UICollectionViewCell = 4 collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", 5 for: indexPath) 6 let storyboard: UIStoryboard = self.storyboard! 7 let BCV = storyboard.instantiateViewController(withIdentifier: "BCV") as! FashionPageViewController 8 let color:UIColor? = BCV.color 9 10 cell.backgroundColor = color 11 12 return Cell

B にて ①タップされた色をColorに格納 ② A.collectionView.reload()
③ Bを閉じる という動きをしています.

Swift

1 func updataColor(){ 2//格納は違う関数で行っています. 3 4 let storyboard: UIStoryboard = self.storyboard! 5 let AVC = storyboard.instantiateViewController(withIdentifier: "viewA") as! ViewAController 6 7 AVC.collectionView.reloadData() 8 9//閉じるのも違う関数で行っています. 10 }

発生している問題・エラーメッセージ

実行すると
AVC.collectionView.reloadData()で,以下のものが表示されます.

Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value

該当のソースコード

CollectionViewはA画面のController内にて

Swift

1 @IBOutlet weak var collectionView: UICollectionView!

をアウトレット接続をしています.

文字も緑になります.

試したこと

A画面にて,自身を更新させるのはどうかと思い,
AControllerViewにてもreloadを行ったのですが,結果は同じでした.
(このときは,self.collectionView.reloadData()と書きました)

このとき,
printfでreloadの前で確認したところ,~~変数colorの値の引き渡しはうまくいっていましたが,~~ACVでのviewWillAppearで値をみたら変えられてなかったです.
CollectionView自体がnilになっていました.

viewDidLoad()時点では,CollectionViewは接続されていました.

再接続してもだめで,
A,BCVどちらに書いても文字色は変わりますし,エラーも実行するまで出ません.

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

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

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

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

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

fuzzball

2020/07/10 03:57

updateColor()の中の、 let AVC = storyboard.instantiateViewController(withIdentifier: "viewA") as! ViewAController これは、新規にViewAControllerを生成しています。 現在表示されている(Bの裏側にある)ViewAControllerではありません。
fuzzball

2020/07/10 04:04

Bはどうやって表示していますか? present(_:animated:completion:) でしょうか?
退会済みユーザー

退会済みユーザー

2020/07/10 06:56

そうだったのですか!nilになった理由はそれですね. 言われてみれば,確かに定義しているのですからそうですね.. Bの表示については,ご指摘の通り, self.present(BCV, animated: true, completion: nil) で表示させております.
fuzzball

2020/07/10 07:28

A側の、 let BCV = storyboard.instantiateViewController(withIdentifier: "BCV") as! FashionPageViewController これもさっきのと同じで、ここで新規に B を生成しています。(当然ながらBCV.colorは初期値の緑。ついでに書くと、BCVじゃなくてBVC) 【手順まとめ】 1. A画面の各セルの色情報は、AVCで管理する。 2. B画面で色を選択したときにAVCの色情報を書き換える。(&リロード) 3. AVCのcellForItemAtでは、色情報を参照してセルに色を付ける。
退会済みユーザー

退会済みユーザー

2020/07/11 14:20

ご協力とご指摘,ありがとうございます. 頂いたヒントと手順で実装できました. ほんとうにありがとうございました.
guest

回答2

0

modal遷移だという前提ですが。

任意のタイミングじゃなくて、BからAに戻るときにAのcollectionViewを更新したいということじゃないんですかね。

任意のタイミングなら、presentingViewControllerで取得・値渡し・リロード

戻るとき特化なら、Unwind Segueのほうがわかりやすい

投稿2020/07/10 05:59

編集2020/07/10 06:16
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ベストアンサー

質問にあるfuzzball様の手順で解決しました.

投稿2020/07/11 14:24

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問