Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // AppDelegate.swift
- // CD People
- //
- // Created by stabirca on 21/03/2021.
- //
- import UIKit
- import CoreData
- @main
- class AppDelegate: UIResponder, UIApplicationDelegate {
- func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
- // Override point for customization after application launch.
- return true
- }
- // MARK: UISceneSession Lifecycle
- func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
- // Called when a new scene session is being created.
- // Use this method to select a configuration to create the new scene with.
- return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
- }
- func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
- // Called when the user discards a scene session.
- // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
- // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
- }
- // MARK: - Core Data stack
- lazy var persistentContainer: NSPersistentContainer = {
- /*
- The persistent container for the application. This implementation
- creates and returns a container, having loaded the store for the
- application to it. This property is optional since there are legitimate
- error conditions that could cause the creation of the store to fail.
- */
- let container = NSPersistentContainer(name: "CD_People")
- container.loadPersistentStores(completionHandler: { (storeDescription, error) in
- if let error = error as NSError? {
- // Replace this implementation with code to handle the error appropriately.
- // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
- /*
- Typical reasons for an error here include:
- * The parent directory does not exist, cannot be created, or disallows writing.
- * The persistent store is not accessible, due to permissions or data protection when the device is locked.
- * The device is out of space.
- * The store could not be migrated to the current model version.
- Check the error message to determine what the actual problem was.
- */
- 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 {
- // Replace this implementation with code to handle the error appropriately.
- // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
- let nserror = error as NSError
- fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
- }
- }
- }
- }
- //
- // SceneDelegate.swift
- // CD People
- //
- // Created by stabirca on 21/03/2021.
- //
- import UIKit
- class SceneDelegate: UIResponder, UIWindowSceneDelegate {
- var window: UIWindow?
- func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
- // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
- // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
- // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
- guard let _ = (scene as? UIWindowScene) else { return }
- }
- func sceneDidDisconnect(_ scene: UIScene) {
- // Called as the scene is being released by the system.
- // This occurs shortly after the scene enters the background, or when its session is discarded.
- // Release any resources associated with this scene that can be re-created the next time the scene connects.
- // The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead).
- }
- func sceneDidBecomeActive(_ scene: UIScene) {
- // Called when the scene has moved from an inactive state to an active state.
- // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
- }
- func sceneWillResignActive(_ scene: UIScene) {
- // Called when the scene will move from an active state to an inactive state.
- // This may occur due to temporary interruptions (ex. an incoming phone call).
- }
- func sceneWillEnterForeground(_ scene: UIScene) {
- // Called as the scene transitions from the background to the foreground.
- // Use this method to undo the changes made on entering the background.
- }
- func sceneDidEnterBackground(_ scene: UIScene) {
- // Called as the scene transitions from the foreground to the background.
- // Use this method to save data, release shared resources, and store enough scene-specific state information
- // to restore the scene back to its current state.
- // Save changes in the application's managed object context when the application transitions to the background.
- (UIApplication.shared.delegate as? AppDelegate)?.saveContext()
- }
- }
- //
- // PeopleTableViewController.swift
- // CD People
- //
- // Created by stabirca on 21/03/2021.
- //
- import UIKit
- import CoreData
- class PeopleTableViewController: UITableViewController, NSFetchedResultsControllerDelegate {
- // core data objects and functions
- let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
- var pManagedObject : People! = nil
- var pEntity : NSEntityDescription! = nil
- var frc : NSFetchedResultsController<NSFetchRequestResult>! = nil
- func makeRequest() -> NSFetchRequest<NSFetchRequestResult>{
- let request = NSFetchRequest<NSFetchRequestResult>(entityName: "People")
- // define predicates and sorters
- let sorter = NSSortDescriptor(key: "name", ascending: true)
- request.sortDescriptors = [sorter]
- return request
- }
- override func viewDidLoad() {
- super.viewDidLoad()
- // frc gets the data from People
- frc = NSFetchedResultsController(fetchRequest: makeRequest(), managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
- frc.delegate = self
- do{
- try frc.performFetch()
- }catch{
- print("CD CANNOT FETCH")
- }
- }
- func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
- tableView.reloadData()
- }
- // MARK: - Table view data source
- override func numberOfSections(in tableView: UITableView) -> Int {
- // #warning Incomplete implementation, return the number of sections
- return 1
- }
- override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
- // #warning Incomplete implementation, return the number of rows
- return frc.sections![section].numberOfObjects
- }
- override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
- let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
- // Configure the cell...
- pManagedObject = (frc.object(at: indexPath) as! People)
- cell.textLabel?.text = pManagedObject.name
- cell.detailTextLabel?.text = pManagedObject.phone
- return cell
- }
- // Override to support conditional editing of the table view.
- override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
- // Return false if you do not want the specified item to be editable.
- return true
- }
- // Override to support editing the table view.
- override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
- if editingStyle == .delete {
- // Delete the row from the data source
- pManagedObject = frc.object(at: indexPath) as! People
- context.delete(pManagedObject)
- do{
- try context.save()
- }catch{
- print("CD CONTEXT CANNOT SAVE")
- }
- do{
- try frc.performFetch()
- }catch{
- print("CD CANNOT FETCH")
- }
- tableView.reloadData()
- }
- }
- /*
- // Override to support rearranging the table view.
- override func tableView(_ tableView: UITableView, moveRowAt fromIndexPath: IndexPath, to: IndexPath) {
- }
- */
- /*
- // Override to support conditional rearranging of the table view.
- override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {
- // Return false if you do not want the item to be re-orderable.
- return true
- }
- */
- // MARK: - Navigation
- // In a storyboard-based application, you will often want to do a little preparation before navigation
- override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
- if segue.identifier == "cellSegue"{
- // get the data from frc of indexPath
- let indexPath = tableView.indexPath(for: sender as! UITableViewCell)
- pManagedObject = frc.object(at: indexPath!) as! People
- // push to AddPersonController
- let destination = segue.destination as! AddPersonViewController
- destination.pManagedObject = self.pManagedObject
- }
- }
- }
- //
- // AddPersonViewController.swift
- // CD People
- //
- // Created by stabirca on 21/03/2021.
- //
- import UIKit
- import CoreData
- class AddPersonViewController: UIViewController {
- // outlets and action
- @IBOutlet weak var nameTF: UITextField!
- @IBOutlet weak var phoneTF: UITextField!
- @IBOutlet weak var addressTF: UITextField!
- @IBOutlet weak var emailTF: UITextField!
- @IBOutlet weak var imageTF: UITextField!
- @IBAction func addUpdateAction(_ sender: Any) {
- if pManagedObject == nil{save()}
- else {update()}
- navigationController?.popViewController(animated: true)
- }
- // core data objects and functions
- let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
- var pManagedObject : People! = nil
- var pEntity : NSEntityDescription! = nil
- override func viewDidLoad() {
- super.viewDidLoad()
- // setup the TF-s
- if pManagedObject != nil{
- nameTF.text = pManagedObject.name
- phoneTF.text = pManagedObject.phone
- addressTF.text = pManagedObject.address
- emailTF.text = pManagedObject.email
- imageTF.text = pManagedObject.image
- }
- }
- // function to deal with data
- func update(){
- // update the pManagedObject
- pManagedObject.name = nameTF.text
- pManagedObject.phone = phoneTF.text
- pManagedObject.address = addressTF.text
- pManagedObject.email = emailTF.text
- pManagedObject.image = imageTF.text
- do{
- try context.save()
- }catch{
- print("CD CONTEXT CANNOT SAVE")
- }
- }
- func save(){
- // create a new managed object
- pEntity = NSEntityDescription.entity(forEntityName: "People", in: context)
- pManagedObject = People(entity: pEntity, insertInto: context)
- // update the pManagedObject
- pManagedObject.name = nameTF.text
- pManagedObject.phone = phoneTF.text
- pManagedObject.address = addressTF.text
- pManagedObject.email = emailTF.text
- pManagedObject.image = imageTF.text
- do{
- try context.save()
- }catch{
- print("CD CONTEXT CANNOT SAVE")
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement