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

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

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

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

Swift

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

Q&A

解決済

1回答

486閲覧

textFieldに入力した値を別viewのtablecellに追加したい

tessy_0901

総合スコア15

Xcode

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

Swift

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

0グッド

0クリップ

投稿2018/10/07 05:07

前提・実現したいこと

 Swift4でtableの追加,編集機能を実装しようとしています.
AddGroupViewControllerのtextFieldに値を入力してボタンを押下すると,ViewControllerのTableViewに値が追加されるというように実装したいと考えています.

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

 tableに表示するための配列に入力は成功していますが,reloadData()を行うとThread 1: signal SIGABRTが発生します.

###StoryBoard
unwindには「GoToViewController」というIdentifierを設定しています.
イメージ説明

該当のソースコード

・viewController

swift4

1import UIKit 2 3class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource { 4 5 var GroupTitle:[String] = [] 6 7 @IBOutlet weak var GroupTable: UITableView! 8 @IBOutlet weak var addButton: UIBarButtonItem! 9 10 //ここに戻ってくる時の処理 11 @IBAction func GoToViewController(_ segue : UIStoryboardSegue){ 12 } 13 14 override func viewDidLoad() { 15 super.viewDidLoad() 16 // Do any additional setup after loading the view, typically from a nib. 17 GroupTable.delegate = self 18 GroupTable.dataSource = self 19 20 //セルの編集buttonの追加 21 self.navigationController?.isNavigationBarHidden = false 22 navigationItem.leftBarButtonItem = editButtonItem 23 GroupTable.reloadData() 24 } 25 26 // Table Viewにいくつのセルを表示するかを指定する 27 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 28 return GroupTitle.count 29 } 30 31 // セルに表示する値を設定する 32 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 33 // データを表示するセルを取得する 34 let GroupCell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "Groupcell", for: indexPath) 35 36 // セルに表示する値を設定する 37 GroupCell.textLabel!.text = GroupTitle[indexPath.row] 38 39 // データを設定したセルを返却する 40 return GroupCell 41 } 42 //セルの編集 43 override func setEditing(_ editing: Bool, animated: Bool) { 44 //override前の処理を継続してさせる 45 super.setEditing(editing, animated: animated) 46 GroupTable.isEditing = editing 47 48 //addButton有効化,無効化 49 if editing { 50 addButton.isEnabled = false 51 } 52 else{ 53 addButton.isEnabled = true 54 } 55 } 56 func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { 57 return true 58 } 59 60 //編集ボタンが押下された時の処理 61 func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { 62 63 //dataを消してから 64 GroupTitle.remove(at: indexPath.row) 65 //tableViewCellの削除 66 tableView.deleteRows(at: [indexPath], with: .automatic) 67 GroupTable.reloadData() 68 } 69 70 override func didReceiveMemoryWarning() { 71 super.didReceiveMemoryWarning() 72 // Dispose of any resources that can be recreated. 73 } 74}

・AddGroupViewController

swift4

1import UIKit 2 3class AddGroupViewController: UIViewController { 4 5 @IBOutlet weak var nameTextField: UITextField? 6 var addName : String? 7 8 @IBAction func add(_ sender: Any) { 9 addName = nameTextField?.text 10 } 11 12 //ビュー遷移時にグループ追加処理 13 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 14 if segue.identifier == "GoToViewController"{ 15 let TopView:ViewController = segue.destination as! ViewController 16 17 //addNameが空じゃないときViewControllerのGroupTitleに値を追加 18 if let text = addName, !text.isEmpty { 19 TopView.GroupTitle.append(addName!); 20 21          //ここのrerloadData()をコメントアウトするとエラーはきえるが,Tableが更新されない 22 TopView.GroupTable.reloadData() 23 24 print(TopView.GroupTitle) //値が格納されているか確認 25 26 }else{ 27 print("not add text") 28 } 29 } 30 } 31 32 override func viewDidLoad() { 33 super.viewDidLoad() 34 // Do any additional setup after loading the view. 35 } 36 37 override func didReceiveMemoryWarning() { 38 super.didReceiveMemoryWarning() 39 // Dispose of any resources that can be recreated. 40 } 41}

試したこと

別viewでTableViewを更新することがいけないのかと思い,ViewControllerで同様な処理を書き直しましたが,同じくThread 1: signal SIGABRTが発生しました.

補足情報

・Xcode 10.0
・swift 4.2
・iOS 12

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

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

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

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

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

guest

回答1

0

ベストアンサー

回答

まずunwind関数というのは遷移先で定義されます。コードではすでに書かれているGoToViewController関数がこれにあたります。また、UIStoryboardSegueを引数に持っているので遷移元のインスタンスにも直接アクセスできます。なので遷移元にあるadd関数とaddNameは無くても問題ありません。コメントアウトしてみてください。またadd関数とStoryboardのIBAction接続も切りましょう。

swift

1// var addName : String? 2 3// @IBAction func add(_ sender: Any) { 4// addName = nameTextField?.text 5// }

次に遷移先にあるGoToViewController関数をunwindSegue接続してあるかの確認をしてください。接続がしてなければStoryboard上にあるAddGroupViewControllerをクリック、AddGroupViewController上に三つのボタンが出てきますのでその一番右のボタンにカーソルを合わせてください。"Exit"の文字が表示されます。UIButtonとそのExitを接続するとunwind接続出来る項目が出てきます。多分名前はGoToViewControllerWithSegueのはずです。この項目をクリックしましょう。
これでunwind接続が出来上がりました。

あとはコード上のGoToViewController関数内で遷移元のデータを遷移先に渡してtableViewのリロードを行っていきます。prepare関数内にデータを渡すためのコードの原型が出来上がってるのでこれを修正していきます。またこのprepare関数もコメントアウトしましょう。

swift

1 guard let source = segue.source as? AddGroupViewController else { 2 fatalError() 3 } 4 if let text = source.nameTextField.text { 5 GroupTitle.append(text) 6 GroupTable.reloadData() 7 }

上記のコードをGoToViewController関数内に書けば大丈夫でしょう。

以下余談

クラス名や構造体名は大文字で始めますが、変数名や定数名、関数名は小文字から始めるのがswiftの慣習になります。なので一旦きちんと動作することを確認できたらこういう部分の修正もしていくことをお勧めします。その場合、IBOutletやIBActionで接続されているものは名前の変更が行われると正しく動作しなくなります。なので一旦接続を切ったのち再接続しましょう。

投稿2018/10/07 05:34

編集2018/10/07 06:40
xAxis

総合スコア1349

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

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

tessy_0901

2018/10/07 05:52 編集

@IBAction func add(_ sender: Any) { addName = nameTextField?.text } これに繋がっているボタンが押下された場合unwindするのですが,unwindするときの関数内とはここのことでよろしいでしょうか?
xAxis

2018/10/07 06:04

add関数でunwindなのですね。ならばいくつか追記します。
tessy_0901

2018/10/07 14:38

GoToViewControllerはすでにunwindsegueに接続していたため,prepare関数とadd関数をコメントアウトし,GoToViewControllerに上記のコードを記述したのですがButtonを押した段階でThread 1: signal SIGABRTが出てしまいました.これはテキストボックスに値が入っているかに関わらず起きています. またブレークポイントを設定して確認したところ配列への格納はできていました.
xAxis

2018/10/07 16:47

UIButtonのIBActionの接続は切断されていますか?
tessy_0901

2018/10/08 01:36

はい、add関数の接続は切れておりunwind segueのみ接続されている状態です
xAxis

2018/10/08 01:43

エラーにreasonがあると思うのでその部分をコピペしてください。
tessy_0901

2018/10/09 08:26

reason: 'unable to dequeue a cell with identifier Groupcell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard' この部分で良いでしょうか
xAxis

2018/10/09 08:30

それで合っています。Storyboard上のCellにidentifierをちゃんと割り振ってあるか確認してみてください。割り振ってなければGroupcellと入力を、誤字脱字がないかチェックしてください。
tessy_0901

2018/10/09 13:27

Identifieを割り振ったところちゃんと動作しました! 長々とお答えいただきまことに有難うございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問