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

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

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

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

Q&A

解決済

2回答

3970閲覧

【Swift3】 画面遷移先TextFieldに入力した値を戻った画面のTableViewに表示できない【Todoアプリ】

A2wwM

総合スコア44

Swift

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

0グッド

1クリップ

投稿2017/01/24 08:50

###前提・実現したいこと
プログラミング初心者で今swiftの勉強のために簡単なtodoアプリを作っています。変なUIかもしれませんが、下記がイメージ図です。(tableviewにtodoを表示させるために、遷移先画面のTextFieldでtodoを入力)

イメージ説明

補足:左の画面(class: ViewController) 右の画面(class: TodoViewController)
tableViewCell(identifier: todoCell)
segue(identifier: goSetting)

ここに質問したいことを詳細に書いてください

TextFieldで入力した値をTableViewに表示させようとしている最中なのですが、中々できず
エラーが出てしまいました。

このエラーはどう解消されるのでしょうか?
またお時間があれば、どうコードを書き換えれば、TextFieldに入力した値がTableViewに表示されるのかも教えていただけますと幸いです。

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

① fatal error: Index out of range ② cellが表示されない ③ TextFieldで入力した値を前の画面に戻った際に、cellに表示できない
###該当のソースコード // // ViewController.swift // todo2 segue // // Created by ○○ on 2017/01/23. // Copyright © 2017年 △△ . All rights reserved. // //1画面目の方のコードです import UIKit class ViewController: UIViewController, UITableViewDataSource { //戻ってきた時に値を受ける var word: [String?] = [] override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. tableView.dataSource = self } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } @IBOutlet weak var tableView: UITableView! @IBAction func plus(_ sender: Any) { performSegue(withIdentifier: "goSetting", sender: nil) } //Cellの総数を返すdatasourceメソッド、必ず記述する必要があります func numberOfSections(in tableView: UITableView) -> Int { return 1 } func tableView(_ tableview: UITableView, numberOfRowsInSection section: Int) -> Int { return 5 } //Cellに値を設定するdatasourceメソッド。必ず記述する必要があります func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { //今回表示を行う、cellオブジェクト(1行)を取得する let cell = tableView.dequeueReusableCell(withIdentifier: "todoCell" , for: indexPath) cell.textLabel?.text = word[indexPath.row] return cell } } // // TodoViewController.swift // todo2 segue // // Created by ○○ on 2017/01/23. // Copyright © 2017年 △△. All rights reserved. // //2画面目の方のコードです import UIKit class TodoViewController: UIViewController, UITextFieldDelegate { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. textField.delegate = self } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } /* // MARK: - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // Get the new view controller using segue.destinationViewController. // Pass the selected object to the new view controller. } */ @IBOutlet weak var textField: UITextField! //デリゲートメソッド func textFieldShouldReturn(_ textField: UITextField) -> Bool { //キーボードを閉じる textField.resignFirstResponder() //入力値を受け取る let keyword : [String?] = [textField.text] func prepare(for segue: UIStoryboardSegue, sender: Any?) { //次の画面のインスタンスを取得 let nextViewController = segue.destination as! ViewController //次の画面のインスタンスに取得した値を渡す //ここは.textじゃなくて受け入れる側で用意した箱(変数)の名前 nextViewController.word = keyword } //Bool値を返す return true } }

###試したこと

書籍やwebを参考にやってみたのですが...
どこも配列の中身をtableviewに表示させるというものばかりで、
textfieldに入力した値を随時表示させていくというものが見当たりませんでした

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

swift3.0
xcode8.2.1
macOS Sierra(バージョン 10.12)

汚いコードで申し訳ございませんが、ご教授いただけますと幸いです。
よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

とりあえずTodoViewControllerで文字を入力、戻るとテーブルに入力した文字を表示するところまで以下のコードでできます。

試してみてください。

swift

1import UIKit 2 3class ViewController: UIViewController, UITableViewDataSource, TodoViewControllerDelegate { 4 5 //戻ってきた時に値を受ける 6 var word: [String?] = [] 7 @IBOutlet weak var tableView: UITableView! 8 9 override func viewDidLoad() { 10 super.viewDidLoad() 11 12 tableView.dataSource = self 13 } 14 15 override func viewDidAppear(_ animated: Bool) { 16 super.viewDidAppear(animated) 17 18 tableView.reloadData() 19 } 20 21 func sendText(text: String) { 22 word.append(text) 23 } 24 25 26 @IBAction func plus(_ sender: UIBarButtonItem ) { 27 performSegue(withIdentifier: "goSetting", sender: nil) 28 } 29 30 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 31 if let todoVC = segue.destination as? TodoViewController { 32 todoVC.delegate = self 33 } 34 } 35 36 func tableView(_ tableview: UITableView, numberOfRowsInSection section: Int) -> Int { 37 return word.count 38 } 39 40 //Cellに値を設定するdatasourceメソッド。必ず記述する必要があります 41 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 42 //今回表示を行う、cellオブジェクト(1行)を取得する 43 let cell = tableView.dequeueReusableCell(withIdentifier: "todoCell" , for: indexPath) 44 45 cell.textLabel?.text = word[indexPath.row] 46 return cell 47 } 48} 49 50 51// protocolを定義 52protocol TodoViewControllerDelegate: class { 53 func sendText(text: String) 54} 55 56import UIKit 57 58class TodoViewController: UIViewController, UITextFieldDelegate { 59 60 weak var delegate: TodoViewControllerDelegate? 61 62 override func viewDidLoad() { 63 super.viewDidLoad() 64 65 textField.delegate = self 66 } 67 68 @IBOutlet weak var textField: UITextField! 69 70 //デリゲートメソッド 71 func textFieldShouldReturn(_ textField: UITextField) -> Bool { 72 //キーボードを閉じる 73 textField.resignFirstResponder() 74 75 //入力値をViewControllerに送る 76 delegate?.sendText(text: textField.text!) 77 78 //Bool値を返す 79 return true 80 } 81}

投稿2017/01/24 14:46

_Kentarou

総合スコア8490

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

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

A2wwM

2017/01/24 15:33

ありがとうございます! エラーなく動きましたっ! 結局それぞれのセルを区切るような下線は出ないのですが、これはなぜなのでしょうか?
guest

0

チラっと見ただけですが、

swift

1func tableView(_ tableview: UITableView, numberOfRowsInSection section: Int) -> Int { 2 return 5 3}

これはセルの数を返さなければいけません。
この状態だと、データがあろうが無かろうがセル数が5になります。
データが無いのにtableView(_:cellForRowAt:)の中でwordにアクセスしてしまうために落ちているのだと思います。

ということで、正しくセル(データ)の数を返して下さい。

swift

1func tableView(_ tableview: UITableView, numberOfRowsInSection section: Int) -> Int { 2 return word.count 3}

投稿2017/01/24 09:10

fuzzball

総合スコア16731

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

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

A2wwM

2017/01/24 11:22

回答いただきましてありがとうございますっ! 実は前はおっしゃっていただいた通り return word.count で記述していまして でもそれだとはじめに配列に入っている要素の数分しかセルが表示されなくて... 私は、要素の数に関係なく、一定数(この場合は5)のセルがアプリ起動時に表示されているようにしたかったのにできなかったんです。
fuzzball

2017/01/24 12:25

5個に足りない分は ""(カラ文字列)で初期化(というか追加)してやればいいです。
A2wwM

2017/01/24 13:07

やっぱり表示されないです... なぜなのか...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問