From 7da4b9d056d47fce4e262bdf8baad34390e9a525 Mon Sep 17 00:00:00 2001 From: Mari Sato Date: Tue, 12 May 2020 04:18:36 +0900 Subject: [PATCH 1/2] initial commit --- Todoey.xcodeproj/project.pbxproj | 32 ++++- Todoey/AppDelegate.swift | 56 +++++---- Todoey/Base.lproj/Main.storyboard | 70 +++++++++-- .../Controllers/TodoListViewController.swift | 117 ++++++++++++++++++ Todoey/Data Model/Item.swift | 14 +++ Todoey/ViewController.swift | 20 --- 6 files changed, 249 insertions(+), 60 deletions(-) create mode 100644 Todoey/Controllers/TodoListViewController.swift create mode 100644 Todoey/Data Model/Item.swift delete mode 100644 Todoey/ViewController.swift diff --git a/Todoey.xcodeproj/project.pbxproj b/Todoey.xcodeproj/project.pbxproj index 423123ef..ec7acdec 100644 --- a/Todoey.xcodeproj/project.pbxproj +++ b/Todoey.xcodeproj/project.pbxproj @@ -7,17 +7,19 @@ objects = { /* Begin PBXBuildFile section */ + 9D74BA9A2469B48B006E5DF5 /* Item.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D74BA992469B48B006E5DF5 /* Item.swift */; }; EB2BE4FA239524DB00FB933B /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB2BE4F9239524DB00FB933B /* AppDelegate.swift */; }; - EB2BE4FE239524DB00FB933B /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB2BE4FD239524DB00FB933B /* ViewController.swift */; }; + EB2BE4FE239524DB00FB933B /* TodoListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB2BE4FD239524DB00FB933B /* TodoListViewController.swift */; }; EB2BE501239524DB00FB933B /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = EB2BE4FF239524DB00FB933B /* Main.storyboard */; }; EB2BE503239524DC00FB933B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = EB2BE502239524DC00FB933B /* Assets.xcassets */; }; EB2BE506239524DC00FB933B /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = EB2BE504239524DC00FB933B /* LaunchScreen.storyboard */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 9D74BA992469B48B006E5DF5 /* Item.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Item.swift; sourceTree = ""; }; EB2BE4F6239524DB00FB933B /* Todoey.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Todoey.app; sourceTree = BUILT_PRODUCTS_DIR; }; EB2BE4F9239524DB00FB933B /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - EB2BE4FD239524DB00FB933B /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + EB2BE4FD239524DB00FB933B /* TodoListViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TodoListViewController.swift; sourceTree = ""; }; EB2BE500239524DB00FB933B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; EB2BE502239524DC00FB933B /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; EB2BE505239524DC00FB933B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; @@ -35,6 +37,22 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 9D74BA9B2469B4C9006E5DF5 /* Data Model */ = { + isa = PBXGroup; + children = ( + 9D74BA992469B48B006E5DF5 /* Item.swift */, + ); + path = "Data Model"; + sourceTree = ""; + }; + 9D74BA9C2469B4D3006E5DF5 /* Controllers */ = { + isa = PBXGroup; + children = ( + EB2BE4FD239524DB00FB933B /* TodoListViewController.swift */, + ); + path = Controllers; + sourceTree = ""; + }; EB2BE4ED239524DB00FB933B = { isa = PBXGroup; children = ( @@ -55,11 +73,12 @@ isa = PBXGroup; children = ( EB2BE4F9239524DB00FB933B /* AppDelegate.swift */, - EB2BE4FD239524DB00FB933B /* ViewController.swift */, + 9D74BA9C2469B4D3006E5DF5 /* Controllers */, EB2BE4FF239524DB00FB933B /* Main.storyboard */, EB2BE502239524DC00FB933B /* Assets.xcassets */, EB2BE504239524DC00FB933B /* LaunchScreen.storyboard */, EB2BE507239524DC00FB933B /* Info.plist */, + 9D74BA9B2469B4C9006E5DF5 /* Data Model */, ); path = Todoey; sourceTree = ""; @@ -135,7 +154,8 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - EB2BE4FE239524DB00FB933B /* ViewController.swift in Sources */, + EB2BE4FE239524DB00FB933B /* TodoListViewController.swift in Sources */, + 9D74BA9A2469B48B006E5DF5 /* Item.swift in Sources */, EB2BE4FA239524DB00FB933B /* AppDelegate.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -287,7 +307,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = "com.londonappbrewery.todoey-ios13.Todoey"; + PRODUCT_BUNDLE_IDENTIFIER = "com.masunomatiko.todoey-ios13.Todoey"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; @@ -305,7 +325,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = "com.londonappbrewery.todoey-ios13.Todoey"; + PRODUCT_BUNDLE_IDENTIFIER = "com.masunomatiko.todoey-ios13.Todoey"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; diff --git a/Todoey/AppDelegate.swift b/Todoey/AppDelegate.swift index 9fbce18a..0d9000b0 100644 --- a/Todoey/AppDelegate.swift +++ b/Todoey/AppDelegate.swift @@ -1,12 +1,13 @@ // // AppDelegate.swift -// Destini +// Todoey // -// Created by Philipp Muellauer on 01/09/2015. -// Copyright (c) 2015 London App Brewery. All rights reserved. +// Created by Angela Yu on 16/11/2017. +// Copyright © 2017 Angela Yu. All rights reserved. // import UIKit +import CoreData @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { @@ -15,32 +16,45 @@ class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { - // Override point for customization after application launch. + return true } - func applicationWillResignActive(_ application: UIApplication) { - // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. - // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. - } - func applicationDidEnterBackground(_ application: UIApplication) { - // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. - // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. - } + func applicationWillTerminate(_ application: UIApplication) { - func applicationWillEnterForeground(_ application: UIApplication) { - // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. + self.saveContext() } - - func applicationDidBecomeActive(_ application: UIApplication) { - // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + + // MARK: - Core Data stack + + lazy var persistentContainer: NSPersistentContainer = { + + let container = NSPersistentContainer(name: "DataModel") + container.loadPersistentStores(completionHandler: { (storeDescription, error) in + if let error = error as NSError? { + + fatalError("Unresolved error \(error), \(error.userInfo)") + } + }) + return container + }() + + // MARK: - Core Data Saving support + + func saveContext () { + let context = persistentContainer.viewContext + if context.hasChanges { + do { + try context.save() + } catch { + + let nserror = error as NSError + fatalError("Unresolved error \(nserror), \(nserror.userInfo)") + } + } } - func applicationWillTerminate(_ application: UIApplication) { - // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. - } } - diff --git a/Todoey/Base.lproj/Main.storyboard b/Todoey/Base.lproj/Main.storyboard index 25a76385..d4e6e535 100644 --- a/Todoey/Base.lproj/Main.storyboard +++ b/Todoey/Base.lproj/Main.storyboard @@ -1,24 +1,68 @@ - + + - - + - - + + - - - + + + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Todoey/Controllers/TodoListViewController.swift b/Todoey/Controllers/TodoListViewController.swift new file mode 100644 index 00000000..5f64b4e5 --- /dev/null +++ b/Todoey/Controllers/TodoListViewController.swift @@ -0,0 +1,117 @@ +// +// ViewController.swift +// Todoey +// +// Created by Philipp Muellauer on 02/12/2019. +// Copyright © 2019 App Brewery. All rights reserved. +// + +import UIKit + +class TodoListViewController: UITableViewController{ + + var itemArray = [Item]() +// var itemArray = [ +// "Find Mike", +// "buy gyoza", +// "Done Swift course" +// ] + +// let defaults = UserDefaults.standard + let dataFilePath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first?.appendingPathComponent("Items.plist") + + + override func viewDidLoad() { + super.viewDidLoad() + // Do any additional setup after loading the view. + + print(dataFilePath) + + let newItem = Item() + newItem.title = "Find Mike" + itemArray.append(newItem) + +// if let items = defaults.array(forKey: "TodoItemArray") as? [Item] { +// itemArray = items +// } + loadItems() + } + + override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return itemArray.count + } + + override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: "TodoItemCell", for: indexPath) + + let item = itemArray[indexPath.row] + cell.textLabel?.text = item.title + + cell.accessoryType = item.done ? .checkmark : .none + + return cell + } + + override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + itemArray[indexPath.row].done = !itemArray[indexPath.row].done + + saveItems() + +// tableView.reloadData() + tableView.deselectRow(at: indexPath, animated: true) + } + + @IBAction func addButtonPressed(_ sender: UIBarButtonItem) { + + var textField = UITextField() + + let alert = UIAlertController(title: "Add New Todoey Item", message: "", preferredStyle: .alert) + + let action = UIAlertAction(title: "Add Item", style: .default) { (action) in + let newItem = Item() + newItem.title = textField.text! + self.itemArray.append(newItem) + +// self.defaults.set(self.itemArray, forKey: "TodoItemArray") + + self.saveItems() + + self.tableView.reloadData() + } + + + + alert.addTextField { (alertTextField) in + alertTextField.placeholder = "Create new item" + textField = alertTextField + } + + alert.addAction(action) + present(alert, animated: true, completion: nil) + } + + func saveItems() { + let encoder = PropertyListEncoder() + do { + let data = try encoder.encode(itemArray) + try data.write(to: dataFilePath!) + } catch { + print(error) + } + } + + func loadItems() { + if let data = try? Data(contentsOf: dataFilePath!) { + let decoder = PropertyListDecoder() + do { + itemArray = try decoder.decode([Item].self, from: data) + } catch { + print(error) + } + + } + } + + +} + diff --git a/Todoey/Data Model/Item.swift b/Todoey/Data Model/Item.swift new file mode 100644 index 00000000..5919f6f3 --- /dev/null +++ b/Todoey/Data Model/Item.swift @@ -0,0 +1,14 @@ +// +// Item.swift +// Todoey +// +// Created by 佐藤万莉 on 2020/05/12. +// Copyright © 2020 App Brewery. All rights reserved. +// + +import Foundation + +class Item: Codable { + var title: String = "" + var done: Bool = false +} diff --git a/Todoey/ViewController.swift b/Todoey/ViewController.swift deleted file mode 100644 index 4a475a34..00000000 --- a/Todoey/ViewController.swift +++ /dev/null @@ -1,20 +0,0 @@ -// -// ViewController.swift -// Todoey -// -// Created by Philipp Muellauer on 02/12/2019. -// Copyright © 2019 App Brewery. All rights reserved. -// - -import UIKit - -class ViewController: UIViewController { - - override func viewDidLoad() { - super.viewDidLoad() - // Do any additional setup after loading the view. - } - - -} - From 7193fba1c031e700b97f21219bc7a72315662d62 Mon Sep 17 00:00:00 2001 From: Mari Sato Date: Thu, 14 May 2020 21:06:08 +0900 Subject: [PATCH 2/2] use coredata --- Todoey.xcodeproj/project.pbxproj | 96 +++++++++++++++- .../UserInterfaceState.xcuserstate | Bin 0 -> 41246 bytes .../xcschemes/xcschememanagement.plist | 14 +++ Todoey.xcworkspace/contents.xcworkspacedata | 10 ++ Todoey/Base.lproj/Main.storyboard | 56 +++++++++- .../Controllers/CategoryViewController.swift | 105 ++++++++++++++++++ .../Controllers/TodoListViewController.swift | 91 ++++++++++----- .../DataModel.xcdatamodel/contents | 16 +++ Todoey/Data Model/Item.swift | 14 --- 9 files changed, 353 insertions(+), 49 deletions(-) create mode 100644 Todoey.xcodeproj/project.xcworkspace/xcuserdata/satomari.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 Todoey.xcodeproj/xcuserdata/satomari.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 Todoey.xcworkspace/contents.xcworkspacedata create mode 100644 Todoey/Controllers/CategoryViewController.swift create mode 100644 Todoey/Data Model/DataModel.xcdatamodeld/DataModel.xcdatamodel/contents delete mode 100644 Todoey/Data Model/Item.swift diff --git a/Todoey.xcodeproj/project.pbxproj b/Todoey.xcodeproj/project.pbxproj index ec7acdec..5a268849 100644 --- a/Todoey.xcodeproj/project.pbxproj +++ b/Todoey.xcodeproj/project.pbxproj @@ -7,7 +7,9 @@ objects = { /* Begin PBXBuildFile section */ - 9D74BA9A2469B48B006E5DF5 /* Item.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D74BA992469B48B006E5DF5 /* Item.swift */; }; + 0CE0D8C0BD1A47BF8F0B1D60 /* Pods_Todoey.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1761A21657AB8618B197D056 /* Pods_Todoey.framework */; }; + 9D74BAA22469DDD7006E5DF5 /* DataModel.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 9D74BAA02469DDD7006E5DF5 /* DataModel.xcdatamodeld */; }; + 9D7DA83E246D064000AD882D /* CategoryViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D7DA83D246D064000AD882D /* CategoryViewController.swift */; }; EB2BE4FA239524DB00FB933B /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB2BE4F9239524DB00FB933B /* AppDelegate.swift */; }; EB2BE4FE239524DB00FB933B /* TodoListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB2BE4FD239524DB00FB933B /* TodoListViewController.swift */; }; EB2BE501239524DB00FB933B /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = EB2BE4FF239524DB00FB933B /* Main.storyboard */; }; @@ -16,7 +18,11 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ - 9D74BA992469B48B006E5DF5 /* Item.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Item.swift; sourceTree = ""; }; + 0A17296F838C29D43D20A9E0 /* Pods-Todoey.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Todoey.release.xcconfig"; path = "Target Support Files/Pods-Todoey/Pods-Todoey.release.xcconfig"; sourceTree = ""; }; + 1761A21657AB8618B197D056 /* Pods_Todoey.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Todoey.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9D74BAA12469DDD7006E5DF5 /* DataModel.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = DataModel.xcdatamodel; sourceTree = ""; }; + 9D7DA83D246D064000AD882D /* CategoryViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CategoryViewController.swift; sourceTree = ""; }; + 9FEE6652EA4BF2DDFEBFFA8E /* Pods-Todoey.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Todoey.debug.xcconfig"; path = "Target Support Files/Pods-Todoey/Pods-Todoey.debug.xcconfig"; sourceTree = ""; }; EB2BE4F6239524DB00FB933B /* Todoey.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Todoey.app; sourceTree = BUILT_PRODUCTS_DIR; }; EB2BE4F9239524DB00FB933B /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; EB2BE4FD239524DB00FB933B /* TodoListViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TodoListViewController.swift; sourceTree = ""; }; @@ -31,16 +37,25 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 0CE0D8C0BD1A47BF8F0B1D60 /* Pods_Todoey.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 7FED3DF95005E8AEE77E0ACE /* Frameworks */ = { + isa = PBXGroup; + children = ( + 1761A21657AB8618B197D056 /* Pods_Todoey.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; 9D74BA9B2469B4C9006E5DF5 /* Data Model */ = { isa = PBXGroup; children = ( - 9D74BA992469B48B006E5DF5 /* Item.swift */, + 9D74BAA02469DDD7006E5DF5 /* DataModel.xcdatamodeld */, ); path = "Data Model"; sourceTree = ""; @@ -49,15 +64,28 @@ isa = PBXGroup; children = ( EB2BE4FD239524DB00FB933B /* TodoListViewController.swift */, + 9D7DA83D246D064000AD882D /* CategoryViewController.swift */, ); path = Controllers; sourceTree = ""; }; + B045CBD33A5C732FFFFAFB43 /* Pods */ = { + isa = PBXGroup; + children = ( + 9FEE6652EA4BF2DDFEBFFA8E /* Pods-Todoey.debug.xcconfig */, + 0A17296F838C29D43D20A9E0 /* Pods-Todoey.release.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; EB2BE4ED239524DB00FB933B = { isa = PBXGroup; children = ( EB2BE4F8239524DB00FB933B /* Todoey */, EB2BE4F7239524DB00FB933B /* Products */, + B045CBD33A5C732FFFFAFB43 /* Pods */, + 7FED3DF95005E8AEE77E0ACE /* Frameworks */, ); sourceTree = ""; }; @@ -90,9 +118,11 @@ isa = PBXNativeTarget; buildConfigurationList = EB2BE50A239524DC00FB933B /* Build configuration list for PBXNativeTarget "Todoey" */; buildPhases = ( + 2FE5AE3D7C9EFC78B5C86DA9 /* [CP] Check Pods Manifest.lock */, EB2BE4F2239524DB00FB933B /* Sources */, EB2BE4F3239524DB00FB933B /* Frameworks */, EB2BE4F4239524DB00FB933B /* Resources */, + 15C4C9678707F997B8B479BC /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -149,13 +179,56 @@ }; /* End PBXResourcesBuildPhase section */ +/* Begin PBXShellScriptBuildPhase section */ + 15C4C9678707F997B8B479BC /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Todoey/Pods-Todoey-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Todoey/Pods-Todoey-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Todoey/Pods-Todoey-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 2FE5AE3D7C9EFC78B5C86DA9 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Todoey-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + /* Begin PBXSourcesBuildPhase section */ EB2BE4F2239524DB00FB933B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 9D7DA83E246D064000AD882D /* CategoryViewController.swift in Sources */, EB2BE4FE239524DB00FB933B /* TodoListViewController.swift in Sources */, - 9D74BA9A2469B48B006E5DF5 /* Item.swift in Sources */, + 9D74BAA22469DDD7006E5DF5 /* DataModel.xcdatamodeld in Sources */, EB2BE4FA239524DB00FB933B /* AppDelegate.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -298,6 +371,7 @@ }; EB2BE50B239524DC00FB933B /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 9FEE6652EA4BF2DDFEBFFA8E /* Pods-Todoey.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_STYLE = Automatic; @@ -316,6 +390,7 @@ }; EB2BE50C239524DC00FB933B /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 0A17296F838C29D43D20A9E0 /* Pods-Todoey.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_STYLE = Automatic; @@ -354,6 +429,19 @@ defaultConfigurationName = Release; }; /* End XCConfigurationList section */ + +/* Begin XCVersionGroup section */ + 9D74BAA02469DDD7006E5DF5 /* DataModel.xcdatamodeld */ = { + isa = XCVersionGroup; + children = ( + 9D74BAA12469DDD7006E5DF5 /* DataModel.xcdatamodel */, + ); + currentVersion = 9D74BAA12469DDD7006E5DF5 /* DataModel.xcdatamodel */; + path = DataModel.xcdatamodeld; + sourceTree = ""; + versionGroupType = wrapper.xcdatamodel; + }; +/* End XCVersionGroup section */ }; rootObject = EB2BE4EE239524DB00FB933B /* Project object */; } diff --git a/Todoey.xcodeproj/project.xcworkspace/xcuserdata/satomari.xcuserdatad/UserInterfaceState.xcuserstate b/Todoey.xcodeproj/project.xcworkspace/xcuserdata/satomari.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..7556fae06ec07ded4eaefec15c52aff34fc0689d GIT binary patch literal 41246 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 + + + + SchemeUserState + + Todoey.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/Todoey.xcworkspace/contents.xcworkspacedata b/Todoey.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..c0221ece --- /dev/null +++ b/Todoey.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/Todoey/Base.lproj/Main.storyboard b/Todoey/Base.lproj/Main.storyboard index d4e6e535..6ad413b4 100644 --- a/Todoey/Base.lproj/Main.storyboard +++ b/Todoey/Base.lproj/Main.storyboard @@ -14,9 +14,17 @@ + + + + + + + + - + @@ -40,7 +48,7 @@ - + @@ -57,12 +65,54 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Todoey/Controllers/CategoryViewController.swift b/Todoey/Controllers/CategoryViewController.swift new file mode 100644 index 00000000..4da1bff7 --- /dev/null +++ b/Todoey/Controllers/CategoryViewController.swift @@ -0,0 +1,105 @@ +// +// CategoryViewController.swift +// Todoey +// +// Created by 佐藤万莉 on 2020/05/14. +// Copyright © 2020 App Brewery. All rights reserved. +// + +import Foundation +import UIKit +import CoreData + +class CategoryViewController: UITableViewController { + override func viewDidLoad() { + super.viewDidLoad() + loadCategories() + } + + var category: String = "" + + var categoryArray = [Category]() + + let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext + + override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return categoryArray.count + } + + override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: "CategoryCell", for: indexPath) + + cell.textLabel?.text = categoryArray[indexPath.row].name + + return cell + } + + override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + category = categoryArray[indexPath.row].name! + performSegue(withIdentifier: "goToItems", sender: nil) + + } + + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { + if segue.identifier == "goToItems" { + let todoVC = segue.destination as! TodoListViewController + if let indexPath = tableView.indexPathForSelectedRow { + todoVC.selectedCategory = categoryArray[indexPath.row] + } + } + } + + + + @IBAction func addButtonPressed(_ sender: UIBarButtonItem) { + var textField = UITextField() + + let alert = UIAlertController(title: "Add New Todoey category", message: "", preferredStyle: .alert) + + let action = UIAlertAction(title: "AddItem", style: .default) { (action) in + let newCategory = Category(context: self.context) + newCategory.name = textField.text! + + self.categoryArray.append(newCategory) + self.saveCategories() + self.tableView.reloadData() + + } + + alert.addTextField { (alertTextField) in + alertTextField.placeholder = "Create new category" + textField = alertTextField + } + + alert.addAction(action) + present(alert, animated: true, completion: nil) + + +// MARK: - Tableview Detasource Methods + +// MARK: - Tableview Delegate Methods + +// MARK: - Tableview Data Manipulation Methods + } + + func loadCategories(with request: NSFetchRequest = Category.fetchRequest()) { + + do { + categoryArray = try context.fetch(request) + } catch { + print(error) + } + tableView.reloadData() + } + + func saveCategories() { + do { + try context.save() + } catch { + print(error) + } + + } +} + + diff --git a/Todoey/Controllers/TodoListViewController.swift b/Todoey/Controllers/TodoListViewController.swift index 5f64b4e5..990c882c 100644 --- a/Todoey/Controllers/TodoListViewController.swift +++ b/Todoey/Controllers/TodoListViewController.swift @@ -7,8 +7,9 @@ // import UIKit +import CoreData -class TodoListViewController: UITableViewController{ +class TodoListViewController: UITableViewController { var itemArray = [Item]() // var itemArray = [ @@ -17,24 +18,24 @@ class TodoListViewController: UITableViewController{ // "Done Swift course" // ] -// let defaults = UserDefaults.standard - let dataFilePath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first?.appendingPathComponent("Items.plist") + var selectedCategory: Category? { + didSet{ + loadItems() + } + } +// let defaults = UserDefaults.standard +// let dataFilePath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first?.appendingPathComponent("Items.plist") + let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. - print(dataFilePath) - - let newItem = Item() - newItem.title = "Find Mike" - itemArray.append(newItem) +// print(dataFilePath) + +// loadItems() -// if let items = defaults.array(forKey: "TodoItemArray") as? [Item] { -// itemArray = items -// } - loadItems() } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { @@ -57,7 +58,7 @@ class TodoListViewController: UITableViewController{ saveItems() -// tableView.reloadData() + tableView.reloadData() tableView.deselectRow(at: indexPath, animated: true) } @@ -68,12 +69,13 @@ class TodoListViewController: UITableViewController{ let alert = UIAlertController(title: "Add New Todoey Item", message: "", preferredStyle: .alert) let action = UIAlertAction(title: "Add Item", style: .default) { (action) in - let newItem = Item() + + let newItem = Item(context: self.context) newItem.title = textField.text! + newItem.done = false + newItem.parentCategory = self.selectedCategory self.itemArray.append(newItem) -// self.defaults.set(self.itemArray, forKey: "TodoItemArray") - self.saveItems() self.tableView.reloadData() @@ -91,27 +93,60 @@ class TodoListViewController: UITableViewController{ } func saveItems() { - let encoder = PropertyListEncoder() + do { - let data = try encoder.encode(itemArray) - try data.write(to: dataFilePath!) + try context.save() + } catch { print(error) } } - func loadItems() { - if let data = try? Data(contentsOf: dataFilePath!) { - let decoder = PropertyListDecoder() - do { - itemArray = try decoder.decode([Item].self, from: data) - } catch { - print(error) - } - + func loadItems(with request: NSFetchRequest = Item.fetchRequest(), predicate: NSPredicate? = nil) { + + let categoryPredicate = NSPredicate(format: "parentCategory.name MATCHES %@", selectedCategory!.name!) + + if let additionalPredicate = predicate { + request.predicate = NSCompoundPredicate(andPredicateWithSubpredicates: [categoryPredicate, additionalPredicate]) + } else { + request.predicate = categoryPredicate + } + + + do { + itemArray = try context.fetch(request) + } catch { + print(error) } + tableView.reloadData() + } } +//MARK: - Searchbar methods + +extension TodoListViewController: UISearchBarDelegate { + func searchBarSearchButtonClicked(_ searchBar: UISearchBar) { + let request: NSFetchRequest = Item.fetchRequest() + + let predicate = NSPredicate(format: "title CONTAINS[cd] %@", searchBar.text!) + + request.predicate = predicate + + let sortDescriptor = NSSortDescriptor(key: "title", ascending: true) + request.sortDescriptors = [sortDescriptor] + + loadItems(with: request) + + } + + func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { + loadItems() + DispatchQueue.main.async { + searchBar.resignFirstResponder() + } + + } +} diff --git a/Todoey/Data Model/DataModel.xcdatamodeld/DataModel.xcdatamodel/contents b/Todoey/Data Model/DataModel.xcdatamodeld/DataModel.xcdatamodel/contents new file mode 100644 index 00000000..bdefb3f3 --- /dev/null +++ b/Todoey/Data Model/DataModel.xcdatamodeld/DataModel.xcdatamodel/contents @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Todoey/Data Model/Item.swift b/Todoey/Data Model/Item.swift deleted file mode 100644 index 5919f6f3..00000000 --- a/Todoey/Data Model/Item.swift +++ /dev/null @@ -1,14 +0,0 @@ -// -// Item.swift -// Todoey -// -// Created by 佐藤万莉 on 2020/05/12. -// Copyright © 2020 App Brewery. All rights reserved. -// - -import Foundation - -class Item: Codable { - var title: String = "" - var done: Bool = false -}