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

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

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

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

Xcode

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

Swift

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

1回答

1493閲覧

Swift3 TableViewの文字がダブって表示されてしまいます。

KokokaraYoshiki

総合スコア27

TableView

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

Xcode

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

Swift

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2017/07/01 23:39

編集2017/07/03 05:44

###前提・実現したいこと
現在coradetaからデータを取り出しTableViewカスタムセルを使って2つのlabelを表示しています。
始め起動時には入力した文字或いは入力した文字がが入っているのですが2回目以降その一番初めに入力した文字まで再度TableViewに表示されてしまいます。

###発生している問題・

TableViewの文字がダブって再度TableViewに表示されてしまいます。
2度、3度行うとnilが入ってしまう為エラーになってしまいます。

###該当のソースコード

Swift3

1 2 3 4import UIKit 5import CoreData 6 7class ToDo_GoalViewController: UIViewController,UITableViewDelegate,UITableViewDataSource { 8//MARK:プロパティ 9 var todoTask:[String] = ["初めての投稿"] 10 var goalTask:[String] = [""] 11 var goalTaskDetail:[String] = [""] 12 13 @IBOutlet weak var mainView: UIView! 14 @IBOutlet weak var subView: UIView! 15 @IBOutlet weak var TableView: UITableView! 16 @IBOutlet weak var subTableView: UITableView! 17 18 @IBAction func addToDo(_ sender: UIButton) { 19 // テキストフィールド付きアラート表示 20 let alert = UIAlertController(title: "ToDo", message: "文字を入力してください。", preferredStyle: .alert) 21 // OKボタンの設定 22 let okAction = UIAlertAction(title: "OK", style: .default, handler: { 23 (action:UIAlertAction!) -> Void in 24 // OKを押した時入力されていたテキストを表示 25 if let textFields = alert.textFields { 26 // アラートに含まれるすべてのテキストフィールドを調べる 27 for textField in textFields { 28 // AppDelegateのインスタンスを用意しておく 29 let appDelegate:AppDelegate = UIApplication.shared.delegate as! AppDelegate 30 // エンティティを操作するためのオブジェクト 31 let viewContext = appDelegate.persistentContainer.viewContext 32 // ToDoエンティティオブジェクトを作成 33 let ToDoGoal = NSEntityDescription.entity(forEntityName: "ToDoGoal", in: viewContext) 34 // ToDoエンティティにレコード(行)を挿入するためのオブジェクトを作成 35 let newRecord = NSManagedObject(entity: ToDoGoal!, insertInto: viewContext) 36 // 追加したいデータ(txtTitleに入力された文字)のセット 37 if textField.text! == "" || textField.text! == nil{ 38 print("nilが入っています。") 39 }else{ 40 newRecord.setValue(textField.text!, forKey: "todoText") 41// newRecord.setValue(Date(), forKey: "todoDeta") 42 43 // レコード(行)の即時保存 44 do{ 45 try viewContext.save() 46 }catch{ 47 } 48 print("右の文字が入る\(textField.text!)") 49 50 self.todoTask.append(textField.text!) 51 self.TableView.reloadData() 52 53 } 54 } 55 } 56 }) 57 alert.addAction(okAction) 58 // キャンセルボタンの設定 59 let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil) 60 alert.addAction(cancelAction) 61 // テキストフィールドを追加 62 alert.addTextField(configurationHandler: {(textField: UITextField!) -> Void in 63 textField.placeholder = "テキスト" 64 }) 65 alert.view.setNeedsLayout() // シミュレータの種類によっては、これがないと警告が発生 66 // アラートを画面に表示 67 self.present(alert, animated: true, completion: nil) 68 } 69 70 71 // ⑵行数を決める 72 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 73 if tableView.tag == 1{ 74 print(tableView.tag) 75 return todoTask.count 76 }else{ 77 print(tableView.tag) 78// return goalTask.count 79 return goalTaskDetail.count 80 } 81 } 82 83 // ⑶リストに表示する文字列を決定し、表示 84 func tableView(_ tableView: UITableView, cellForRowAt indexPath:IndexPath) -> UITableViewCell { 85 // 文字を表示するセルの取得(セルの再利用) 86 let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! CustomTableViewCell 87 // 表示したい文字の設定 88 if tableView.tag == 1{ 89 cell.textLabel?.text=todoTask[indexPath.row] 90 return cell 91 }else{ 92 cell.goalDetail?.text=goalTaskDetail[indexPath.row] 93 cell.goalTitle?.text=goalTask[indexPath.row] 94 return cell 95 } 96 } 97 98 func read(){ 99 // AooDelegateを使う用意をしておく 100 let appDelegate:AppDelegate = UIApplication.shared.delegate as! AppDelegate 101 // エンティティを操作するためのオブジェクトを作成 102 let viewContext = appDelegate.persistentContainer.viewContext 103 // どのエンティティからデータを取得してくるか設定 104 let query:NSFetchRequest<ToDoGoal> = ToDoGoal.fetchRequest() 105 do{ 106 // データの一括取得 107 let fetchResults = try viewContext.fetch(query) 108 // ループで一行ずつ表示 109 for result : AnyObject in fetchResults { 110 // 一行ずつのデータを取得する 111// MARK:todoTextのアペンド 112 var todoText:String = "" 113 if result.value(forKey: "todoText") == nil { 114 print("ToDoなし") 115 }else{ 116 todoText = result.value(forKey: "todoText") as! String 117 todoTask.append(todoText) 118 print("todoTextは:\(todoText)") 119 } 120 121// MARK:goalTextのアペンド 122 var goalText:String = "" 123 var goaletail:String = ""//追加 124 if result.value(forKey: "goalTitle") == nil || result.value(forKey: "goalDetail") == nil { 125 print("goalTextなし") 126 print("goalDetailなし") 127 }else{ 128 goalText = result.value(forKey: "goalTitle") as! String 129 goaletail = result.value(forKey: "goalDetail") as! String//追加 130 print("goalTitle:は\(goalText)") 131 print("goaletail:は\(goaletail)")//追加 132 goalTask.append(goalText) 133 goalTaskDetail.append(goaletail)//追加 134 } 135 } 136 }catch{ 137 // エラーが起きた時に通常処理の代わりに行う処理を記述(例外処理を記述する場合) 138 } 139 } 140 141 override func viewWillAppear(_ animated: Bool) { 142 // CoreDataからデータをfetchしてくる 143 read() 144 // self.TableView.reloadData() 145 146 self.subTableView.reloadData() 147 } 148 149 150 // MARK:初期設定メソッド 151 override func viewDidLoad() { 152 super.viewDidLoad() 153 154 155 156 } 157 158 override func didReceiveMemoryWarning() { 159 super.didReceiveMemoryWarning() 160 } 161} 162 163

class

1 @IBOutlet weak var textField: UITextField! 2 3 @IBOutlet weak var textView: UITextView! 4 5 6 7 @IBAction func addBtn(_ sender: UIButton) { 8 9 let taskName = textField.text 10 let task = textView.text 11 // let taskView = textView.text 12 // 条件追加でから文字を指定できる 13 // 画面戻ります 14 print("文字が入力された") 15 let storyboard: UIStoryboard = self.storyboard! 16 17 self.dismiss(animated: true, completion: nil) 18 // context(データベースを扱うのに必要)を定義。 19 let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext 20 // (データベースのエンティティです)型オブジェクトを代入します。 21 let todogoal = ToDoGoal (context: context) 22 // 先ほど定義したTask型データのname、categoryプロパティに入力、選択したデータを代入します。 23 if taskName == "" || taskName == nil || task == "" || task == nil { 24 print("文字が入力されていない") 25 // textLabel.text = "文字が入力されていません" 26 }else{ 27 28 todogoal.goalTitle = taskName! 29 todogoal.goalDetail = task! 30 31 print("タイトル:\(todogoal.goalTitle!)") 32 print("詳細\(todogoal.goalDetail!)") 33 34 35 // 上で作成したデータをデータベースに保存します。 36 (UIApplication.shared.delegate as! AppDelegate).saveContext() 37 } 38 } 39 40 41// 戻るボタン 42 @IBAction func back(_ sender: UIButton) { 43 self.dismiss(animated: true, completion: nil) 44 } 45 46 @IBAction func textFieldBack(_ sender: UITextField) { 47 } 48 49 func makeKeybord(){ 50 // 仮のサイズでツールバー生成 51 let kbToolBar = UIToolbar(frame: CGRect(x: 0, y: 0, width: 320, height: 40)) 52 kbToolBar.barStyle = UIBarStyle.default // スタイルを設定 53 54 kbToolBar.sizeToFit() // 画面幅に合わせてサイズを変更 55 56 // スペーサー 57 let spacer = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: self, action: nil) 58 59 // 閉じるボタン 60 let commitButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.done, target: self, action: #selector(GoalViewController.commitButtonTapped)) 61 62 kbToolBar.items = [spacer, commitButton] 63 textView.inputAccessoryView = kbToolBar 64 } 65 66 func commitButtonTapped (){ 67 self.view.endEditing(true) 68 } 69 70 71 72 73 74 override func viewDidLoad() { 75 super.viewDidLoad() 76 makeKeybord() 77 78 } 79 80 81 override func didReceiveMemoryWarning() { 82 super.didReceiveMemoryWarning() 83 84 } 85 86 87} 88

###試したこと
tableViewのnumberOfRowsInSectionで表示行数の変更 ×
tableViewのcellForRowAt indexPathでreturnの文字変更 ×
func read()のアペンドしている箇所をprintで確認等
2~3回同じことを繰り返す(原因不明)
###補足情報(言語/FW/ツール等のバージョンなど)
Swift3 Xcode10.3 Mac

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

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

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

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

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

KokokaraYoshiki

2017/07/03 01:00

ありがとうございます。囲いましたらコードとして認識しました。ちなみに上記の解決方法がわかれば御鞭撻願います。
fuzzball

2017/07/03 01:26

CoreDataの問題なのか、TableViewの問題なのか、切り分けて下さい。
KokokaraYoshiki

2017/07/03 04:20

TableViewの問題です。CoreDataのソースを削除いたしました。1回目の追加ボタンを押すと1回目の文字、2回目の追加ボタンを押すと1回目の文字と2回目の文字が表示されるといったように文字がダブってしまいます。これは一体なぜでしょか。
fuzzball

2017/07/03 04:34

質問のコードではtodoTaskにしかデータが追加されていませんが、実際のコードでもgoalTaskにデータは追加されていない状態でしょうか?
KokokaraYoshiki

2017/07/03 05:42

上記に再度記載させていただきました。
guest

回答1

0

ベストアンサー

セルが使い回されることを忘れないで下さい。

swift

1if tableView.tag == 1{ 2 cell.textLabel?.text = todoTask[indexPath.row] 3 cell.goalDetail?.text = "" //※ 4 cell.goalTitle?.text = "" //※ 5 return cell 6}else{ 7 cell.textLabel?.text = "" //※ 8 cell.goalDetail?.text = goalTaskDetail[indexPath.row] 9 cell.goalTitle?.text = goalTask[indexPath.row] 10 return cell 11}

投稿2017/07/03 05:49

fuzzball

総合スコア16731

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

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

KokokaraYoshiki

2017/07/03 10:56

ありがとうございました。 解消されました。 ご親切にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問