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

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

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

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

Swift

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

Q&A

解決済

1回答

309閲覧

CoreDateで保存したデータを1つのセルに表示する方法

gnx_vw903

総合スコア74

Xcode

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

Swift

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

0グッド

0クリップ

投稿2019/03/04 02:00

前提・実現したいこと

SwiftのCoreDateを使ってToDoアプリを作成しようと考えています。
機能としてはカテゴリーを分けとToDoの日時を追加したいと考えています。

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

カテゴリー分けした際に、TableViewを使用し、ToDoと日時を同じCellに表示したいと考えているのですが上手くいきません。

該当のソースコード

以下がコードの全文になります

ViewController.swift

Swift

1import UIKit 2import CoreData 3 4class AddTaskViewController: UIViewController { 5 @IBOutlet weak var taskTextField: UITextField! 6 @IBOutlet weak var categoryegmentedControl: UISegmentedControl! 7 @IBOutlet weak var dateTextField: UITextField! 8 9 var taskCategory = "ToDo" 10 11 var datePicker: UIDatePicker = UIDatePicker() 12 13 override func viewDidLoad() { 14 super.viewDidLoad() 15 16 // ピッカー設定 17 datePicker.datePickerMode = UIDatePicker.Mode.date 18 datePicker.timeZone = NSTimeZone.local 19 datePicker.locale = Locale.current 20 dateTextField.inputView = datePicker 21 22 // 決定バーの生成 23 let toolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: view.frame.size.width, height: 35)) 24 let spacelItem = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil) 25 let doneItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(done)) 26 toolbar.setItems([spacelItem, doneItem], animated: true) 27 28 // インプットビュー設定 29 dateTextField.inputView = datePicker 30 dateTextField.inputAccessoryView = toolbar 31 } 32 33 @IBAction func categoryChosen(_ sender: UISegmentedControl) { 34 switch sender.selectedSegmentIndex { 35 case 0: 36 taskCategory = "Indivisual" 37 case 1: 38 taskCategory = "Job" 39 case 2: 40 taskCategory = "Shopping" 41 case 3: 42 taskCategory = "Other" 43 default: 44 taskCategory = "ToDo" 45 } 46 } 47 48 @IBAction func cancelButtonTapped(_ sender: Any) { 49 dismiss(animated: true, completion: nil) 50 } 51 52 @IBAction func plusButtonTapped(_ sender: Any) { 53 // TextFieldに何も入力されていない場合は何もせずに1つ目のビューへ戻る 54 let taskName = taskTextField.text 55 let taskDate = dateTextField.text 56 57 if taskName == "" { 58 dismiss(animated: true, completion: nil) 59 return 60 } 61 62 // contextを定義 63 let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext 64 65 // taskにTask型オブジェクトを代入 66 let task = Task(context: context) 67 68 //選択したデータを代入 69 task.name = taskName 70 task.category = taskCategory 71 task.date = taskDate 72 73 // データベースに保存 74 (UIApplication.shared.delegate as! AppDelegate).saveContext() 75 76 dismiss(animated: true, completion: nil) 77 } 78 79 @objc func done() { 80 dateTextField.endEditing(true) 81 82 // 日付のフォーマット 83 let formatter = DateFormatter() 84 formatter.dateFormat = "yyyy-MM-dd" 85 dateTextField.text = "(formatter.string(from: Date()))" 86 } 87} 88

ViewController.swift

Swift

1import UIKit 2import CoreData 3 4class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 5 @IBOutlet weak var taskTableView: UITableView! 6 7 // MARK: - Properties for table view 8 9 var tasks:[Task] = [] 10 var tasksToShow:[String:[String]] = ["Indivisual":[], "Job":[], "Shopping":[], "Other":[]] 11 let taskCategories:[String] = ["Indivisual", "Job", "Shopping", "Other"] 12 13 // MARK: - Table View Data Source 14 15 // taskCategories[]に格納されている文字列がTableViewのセクションになる 16 func numberOfSections(in tableView: UITableView) -> Int { 17 return taskCategories.count 18 } 19 20 func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 21 return taskCategories[section] 22 } 23 24 // tasksToShowにカテゴリー(tasksToShowのキーとなっている)ごとのnameが格納されている 25 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 26 return tasksToShow[taskCategories[section]]!.count 27 } 28 29 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 30 let cell = UITableViewCell() 31 32 let sectionData = tasksToShow[taskCategories[indexPath.section]] 33 let cellData = sectionData?[indexPath.row] 34 35 cell.textLabel?.text = "(cellData!)" 36 37 return cell 38 } 39 40 // MARK: - View Life Cycle 41 42 override func viewDidLoad() { 43 super.viewDidLoad() 44 45 taskTableView.dataSource = self 46 taskTableView.delegate = self 47 } 48 49 override func viewWillAppear(_ animated: Bool) { 50 // CoreDataからデータをfetchしてくる 51 getData() 52 53 // taskTableViewを再読み込みする 54 taskTableView.reloadData() 55 } 56 57 // MARK: - Method of Getting data from Core Data 58 59 func getData() { 60 // データ保存時と同様にcontextを定義 61 let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext 62 do { 63 // CoreDataからデータをfetchしてtasksに格納 64 let fetchRequest: NSFetchRequest<Task> = Task.fetchRequest() 65 tasks = try context.fetch(fetchRequest) 66 67 // tasksToShow配列を空にする。(同じデータを複数表示しないため) 68 for key in tasksToShow.keys { 69 tasksToShow[key] = [] 70 } 71 // 先ほどfetchしたデータをtasksToShow配列に格納する 72 for task in tasks { 73 tasksToShow[task.category!]?.append(task.name!) 74 tasksToShow[task.category!]?.append(task.date!) 75 } 76 } catch { 77 print("Fetching Failed.") 78 } 79 } 80}

試したこと

tasksToShow[task.category!]?.append(task.name!) tasksToShow[task.category!]?.append(task.date!)

このコードがtask.categoryに関連したtask.nametask.dateを表示していると思ったので、
イメージ説明

tasksToShow[task.category!]?.append(task.name!) tasksToShow[task.name!]?.append(task.date!)

task.categoryに関連したtask.nameを表示し、
そのtask.nameに関連したtask.dateを表示するような形にすれば1つのCellに表示されると考えたのですが表示されなくなりました
イメージ説明

1つのセルに表示するためにアドバイスいただけたら幸いです。
よろしくお願いいたします。

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

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

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

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

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

MasakiHori

2019/03/05 09:43

「UITableViewCell カスタムセル」あたりでググればいいんじゃないかなぁ
guest

回答1

0

ベストアンサー

結論として、かなりベーシックな問題です。UITableViewController関連のチュートリアルをゼロからやってみてください。

解決方法は複数ですね。

正しいのはカスタムセルで

swift

1cell.nameLabel.text = name 2cell.dateLabel.text = date

ディフォルトの「textLabel」をつかうなら:

swift

1cell.textLabel?.text = "(name!) (date!)"

こいう言うデモをみてみてください。swift 3.1なのに、出発点としていいです。
https://github.com/deege/deegeu-ios-swift-tableview-custom-cells

投稿2019/03/06 10:06

vanderlvov

総合スコア685

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問