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

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

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

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

Swift

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

Q&A

解決済

1回答

1513閲覧

TableViewのデータをファイルに保存したい

15DB109_hotaka

総合スコア22

Xcode

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

Swift

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

0グッド

1クリップ

投稿2017/12/22 13:47

textfieldに入力した値をテーブルに反映しています。
そこで、テーブルに表示されているデータを.csv/.txtでDocuments下に保存したいのですが、どうもうまくいきません。
現段階ではDocuments下に.csv/.txtでファイルを作成まではできたのですが、なぜか中身が
空になっています。よろしければご教授ください。

Swift3

1import UIKit 2import RealmSwift 3 4class ViewController: UIViewController, UIPickerViewDelegate, UITextFieldDelegate,UIImagePickerControllerDelegate, UINavigationControllerDelegate,UIPickerViewDataSource { 5 6 var laps: [String] = [] 7 8 var timer = Timer() 9 var minutes: Int = 0 10 var seconds: Int = 0 11 var fractions: Int = 0 12 13 14 var stopwacthString: String = "" 15 16 var startStopWacth: Bool = true 17 var addLap: Bool = false 18 19 20 @IBOutlet weak var name: UITextField! 21 @IBOutlet weak var stopwacthLabel: UILabel! 22 @IBOutlet weak var todoNameText: UITextField! 23 24 let pickerOptions = [["","白","青","-","第1ピリオド","第2ピリオド","第3ピリオド","第4ピリオド"],["","1", "2", "3","4", "5", "6","7", "8", "9","10", "11", "12","13", "14", "15","16", "17", "18","19", "20"],["","AG", "P", "E","ES", "B", "BP","TO", "PG", "EG"],["","0-","1-", "2-", "3-","4-", "5-", "6-","7-", "8-", "9-","10-", "11-", "12-","13-", "14-", "15-","16-", "17-", "18-","19-", "20-"],["","0","1", "2", "3","4", "5", "6","7", "8", "9","10", "11", "12","13", "14", "15","16", "17", "18","19", "20"]] 25 26 @IBOutlet weak var tableView: UITableView! 27 @IBOutlet weak var startstopButton: UIButton! 28 @IBOutlet weak var lapresetButton: UIButton! 29 @IBOutlet weak var resetButttom: UIButton! 30 31 32 override func viewDidLoad() { 33 super.viewDidLoad() 34 // Do any additional setup after loading the view, typically from a nib. 35 name.placeholder = "ファイル名(試合名など)を入力" 36 37 let pickerview = UIPickerView() 38 pickerview.delegate = self 39 todoNameText.inputView = pickerview 40 41 } 42 43 override func didReceiveMemoryWarning() { 44 super.didReceiveMemoryWarning() 45 // Dispose of any resources that can be recreated. 46 stopwacthLabel.text = "00:00.00" 47 } 48 49 func numberOfComponents(in pickerView: UIPickerView) -> Int { 50 51 return pickerOptions.count 52 53 } 54 func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 55 56 return pickerOptions[component].count 57 58 } 59 func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 60 61 return pickerOptions[component][row] 62 63 } 64 func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 65 66 let model = pickerOptions[0][pickerView.selectedRow(inComponent: 0)] 67 let color = pickerOptions[1][pickerView.selectedRow(inComponent: 1)] 68 let AC = pickerOptions[2][pickerView.selectedRow(inComponent: 2)] 69 let White = pickerOptions[3][pickerView.selectedRow(inComponent: 3)] 70 let Blue = pickerOptions[4][pickerView.selectedRow(inComponent: 4)] 71 72 todoNameText.text = " " + stopwacthString + " " + model + " " + color + " " + AC + " " + White + "" + Blue 73 74 } 75 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 76 77 view.endEditing(true) 78 79 } 80 func updateStopwacth() { 81 82 fractions += 1 83 if fractions == 100 { 84 85 seconds += 1 86 fractions = 0 87 } 88 if seconds == 100 { 89 90 minutes += 1 91 seconds = 0 92 } 93 94 let franctionsString = fractions > 9 ?"(fractions)" : "0(fractions)" 95 let secondsString = seconds > 9 ?"(seconds)" : "0(seconds)" 96 let minutesString = minutes > 9 ?"(minutes)" : "0(minutes)" 97 98 stopwacthString = "(minutesString):(secondsString)" 99 stopwacthLabel.text = stopwacthString 100 } 101 102 @IBAction func SaveButtom(_ sender: Any) { 103 104 let name = self.name.text ?? "unknown" 105 let thePath = NSHomeDirectory()+"/Documents/(name).csv" 106 107 let textData = todoNameText?.text 108 109 do { 110 111 try textData?.write(toFile: thePath, atomically: true, encoding: String.Encoding.utf8) 112 } catch let error as NSError { 113 print("保存に失敗。\n (error)") 114 } 115 // ① UIAlertControllerクラスのインスタンスを生成 116 // タイトル, メッセージ, Alertのスタイルを指定する 117 // 第3引数のpreferredStyleでアラートの表示スタイルを指定する 118 let alert: UIAlertController = UIAlertController(title: "作成スコアを保存", message: "保存したデータは”データを送信する”からPCへ送信できます。", preferredStyle: UIAlertControllerStyle.alert) 119 120 // ② Actionの設定 121 // Action初期化時にタイトル, スタイル, 押された時に実行されるハンドラを指定する 122 // 第3引数のUIAlertActionStyleでボタンのスタイルを指定する 123 // OKボタン 124 let defaultAction: UIAlertAction = UIAlertAction(title: "保存", style: UIAlertActionStyle.default, handler:{ 125 // ボタンが押された時の処理を書く(クロージャ実装) 126 (action: UIAlertAction!) -> Void in 127 print("保存") 128 }) 129 // キャンセルボタン 130 let cancelAction: UIAlertAction = UIAlertAction(title: "保存しない", style: UIAlertActionStyle.cancel, handler:{ 131 // ボタンが押された時の処理を書く(クロージャ実装) 132 (action: UIAlertAction!) -> Void in 133 print("保存しない") 134 }) 135 136 // ③ UIAlertControllerにActionを追加 137 alert.addAction(cancelAction) 138 alert.addAction(defaultAction) 139 140 // ④ Alertを表示 141 present(alert, animated: true, completion: nil) 142 143 } 144 @IBAction func addToDo(_ sender: Any) { 145 146 147 if isValidateInputContents() == false{ 148 return 149 } 150 151 152 153 // ToDoデータを作成する処理 154 let toDo = ToDo() 155 toDo.name = todoNameText.text! 156 157 // ToDoデータを永続化する処理 158 do{ 159 let realm = try Realm() 160 try realm.write{ 161 realm.add(toDo) 162 } 163 todoNameText.text = "" 164 }catch{ 165 print("失敗") 166 } 167 tableView.reloadData() 168} 169 170 171private func isValidateInputContents() -> Bool{ 172 // ToDo名のデータ入力 173 if let name = todoNameText.text{ 174 if name.characters.count == 0{ 175 return false 176 } 177 }else{ 178 return false 179 } 180 return true 181} 182 183} 184 185 186 187 188extension ViewController: UITableViewDataSource{ 189 190 191 192 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 193 194 return toDoItems?.count ?? 0 195 196 } 197 198 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 199 200 201 let toDo = toDoItems?[indexPath.row] 202 203 204 205 let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as! ToDoTableViewCell 206 // Realmに登録したデータをラベルに値設定 207 208 209 cell.nameLabel.text = toDo?.name 210 211 print(toDo?.name) 212 213 214 return cell 215 216 } 217 218 219 220// 削除処理 221 func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { 222 if editingStyle == UITableViewCellEditingStyle.delete { 223 224 let realm = try!Realm() 225 226 _ = try!Realm().objects(ToDo.self) 227 228 // これはRealmSwiftでデータを削除しているケース 229 let deleteHistory = self.toDoItems?[indexPath.row] 230 // トランザクションを開始してオブジェクトを削除します 231 try! realm.write { 232 realm.delete(deleteHistory!) 233 } 234 235 236 // TableViewを再読み込み. 237 self.tableView.reloadData() 238 239 240 } 241 242 } 243 244 245 246}

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

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

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

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

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

guest

回答1

0

ベストアンサー

addToDo がどのタイミングで呼ばれるか分かりませんが、
そこで「todoNameText.text = ""」としているようですので、
SaveButtomのタイミングでは空文字列であったりしませんか。

ステップ実行でファイルに書き込む際のtextDataの中身を確認してはいかがでしょうか。

投稿2017/12/22 16:49

nakasho_dev

総合スコア2655

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

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

15DB109_hotaka

2017/12/23 09:06

todoNameText は textfield で ここに入れたデータを addToDo でtableView に挿入しています。 todoNameText はaddToDo でデータを挿入したら todoNameText で空白になります。 なので let textData = todoNameText.text でファイルは空のままなのでしょうか? そうすると、let textData = に何を入れれば tableView のデータがファイルに書き込めるのでしょうか? 説明不足かもしれませんが、宜しくお願いします!
nakasho_dev

2017/12/23 11:22

tableViewは表示するものであって、何かに使うデータを保持するものではありません。 テーブルで表示している内容をファイルに保存する場合はcellForRowAt でtableViewのCellに入れているデータを使うべきです。 toDoItemsから書き込むデータを取得してはいかがでしょうか。
15DB109_hotaka

2017/12/23 16:00

toDoItemsでデータ取得できました!ありがとうございます!! ただ表示がこのようになってしまうのですが、これは仕方ないのでしょうか? name の値だけ取り出すことは可能ですか? 何度もすみません " [0] ToDo {" " name = 00:02 白 2 AG 0-0;" " deadLine = 1970-01-01 00:00:00 +0000;" " isComplete = 0;" " }" " [1] ToDo {" " name = 00:02 白 3 AG 0-4;" " deadLine = 1970-01-01 00:00:00 +0000;" " isComplete = 0;" " }" )
nakasho_dev

2017/12/23 17:33

ToDoというクラスの配列になっているようですので、toDoItems[0].name というように取得すれば良いのではないでしょうか。
15DB109_hotaka

2017/12/23 23:06

let textData = toDoItems?[0].name.description これで0行目のデータは取得できました。[ ]内の値をどのように変えれば全行目の値を一気に取得できますか?
nakasho_dev

2017/12/24 04:41

forEach などで配列をループ処理してください。
15DB109_hotaka

2017/12/24 16:37

ありがとうございます!forEach関数、調べてやってみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問