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

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

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

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

Swift

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

Q&A

0回答

196閲覧

CollectionViewCellを使った画面遷移について

退会済みユーザー

退会済みユーザー

総合スコア0

Xcode

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

Swift

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

0グッド

1クリップ

投稿2018/02/10 09:04

前提・実現したいこと

swiftで時間割アプリを制作しています。アプリ制作は初心者で、参考書やネットで見ながら作っています。
実現したいのはCollectionViewで時間割を表示し、セルをタップすると画面遷移して、その時間の授業名や教室をテキストフィールドで編集できるというものです。
イメージ説明

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

どのセルを押しても最初のセルの中身が表示され、編集して戻す際も最初のセルに反映されてしまいます。

具体的には、セルをタップした際にセルの番号を渡し、その番号をインデックスとしてUserDefaultsに保存された現状の授業名などをテキストフィールドに表示したいのですが、セルが選択された際の値の変更より先にprepareで画面遷移してしまい0で表示されてしまいます。(画面遷移した後に値は渡されます)
また、編集してDoneを押すと、これまた0で渡してしまい、編集した内容が最初のセルに反映されてしまいます。

どのようにすれば、正しく押したセルの番号を渡して編集できるでしょうか。
(配列の宣言とUserDefaultsへの値の保存はAppDelegateで最初の起動のみ行っています。)

該当のソースコード

swift

1import UIKit 2 3class ViewController: UIViewController,UICollectionViewDataSource,UICollectionViewDelegate{ 4 5 var pushV :Int = 0 6 override func viewDidLoad() { 7 super.viewDidLoad() 8 // Do any additional setup after loading the view, typically from a nib. 9 10 } 11 12 // Cell が選択された場合 13 func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 14 let secondView = storyboard?.instantiateViewController(withIdentifier: "second") as! setting 15 secondView.pushed = indexPath.row 16 pushV = indexPath.row 17 18 performSegue(withIdentifier: "toSet",sender: nil) 19 20 } 21 22 // Segue 準備 23 override func prepare(for segue: UIStoryboardSegue, sender: Any!) { 24 if (segue.identifier == "toSet") { 25 let subVC: setting = (segue.destination as? setting)! 26 subVC.pushed = pushV 27 } 28 } 29 30 func collectionView(_ collectionView: UICollectionView, 31 cellForItemAt indexPath: IndexPath) -> UICollectionViewCell{ 32 33 // "Cell" はストーリーボードで設定したセルのID 34 let testCell:UICollectionViewCell = 35 collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", 36 for: indexPath) 37 38 let defaults = UserDefaults() 39 40 let classes = defaults.array(forKey: "classes") as! [String] 41 let teaches = defaults.array(forKey: "teaches") as! [String] 42 let rooms = defaults.array(forKey: "rooms") as! [String] 43 print(indexPath.row) 44 45 46 let label = testCell.contentView.viewWithTag(1) as! UILabel 47 label.text = classes[indexPath.row] 48 49 let label2 = testCell.contentView.viewWithTag(2) as! UILabel 50 label2.text = rooms[indexPath.row] 51 52 let label3 = testCell.contentView.viewWithTag(3) as! UILabel 53 label3.text = teaches[indexPath.row] 54 55 56 return testCell 57 } 58 59 func numberOfSections(in collectionView: UICollectionView) -> Int { 60 // section数 61 return 1 62 } 63 64 func collectionView(_ collectionView: UICollectionView, 65 numberOfItemsInSection section: Int) -> Int { 66 // 要素数 67 return 25; 68 } 69 70 override func didReceiveMemoryWarning() { 71 super.didReceiveMemoryWarning() 72 // Dispose of any resources that can be recreated. 73 } 74 75 76}

swift

1import UIKit 2 3class setting: UIViewController{ 4 @IBOutlet weak var nameClass: UITextField! 5 6 @IBOutlet weak var nameRoom: UITextField! 7 8 @IBOutlet weak var nameTeacher: UITextField! 9 10 var pushed :Int = 0 11 12 override func viewDidLoad() { 13 super.viewDidLoad() 14 15 let defaults = UserDefaults() 16 var classes = defaults.array(forKey: "classes") as! [String] 17 18 var teaches = defaults.array(forKey: "teaches") as! [String] 19 20 var rooms = defaults.array(forKey: "rooms") as! [String] 21 22 nameTeacher.text = teaches[pushed] 23 nameRoom.text = rooms[pushed] 24 nameClass.text = classes[pushed] 25 26 } 27 override func didReceiveMemoryWarning() { 28 super.didReceiveMemoryWarning() 29 } 30 31 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 32 let defaults = UserDefaults() 33 34 print(pushed)//ここでpushedが0に戻っている 35 36 var classes = defaults.array(forKey: "classes") as! [String] 37 classes[pushed] = nameClass.text! 38 var teaches = defaults.array(forKey: "teaches") as! [String] 39 teaches[pushed] = nameTeacher.text! 40 var rooms = defaults.array(forKey: "rooms") as! [String] 41 rooms[pushed] = nameRoom.text! 42 43 defaults.set(classes, forKey: "classes") 44 defaults.set(teaches, forKey: "teaches") 45 defaults.set(rooms, forKey: "rooms") 46 47 defaults.synchronize() 48 49 } 50 51}

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問