application iOS de notes
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
notes/Notes/NotesPageViewController.swift

155 lines
4.9 KiB

//
// NotesPageViewController.swift
// Notes
//
// Created by Laurent Morvillier on 16/10/2022.
//
import Foundation
import UIKit
class NotesPageViewController : UIPageViewController, UIPageViewControllerDelegate, UIPageViewControllerDataSource {
fileprivate var _notes: [Note] = []
fileprivate var _currentIndex: Int = 0
override func viewDidLoad() {
super.viewDidLoad()
self._loadNotes()
let shareButton = UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(shareHandler))
let addButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(addHandler))
let deleteButton = UIBarButtonItem(barButtonSystemItem: .trash, target: self, action: #selector(deleteHandler))
self.navigationItem.rightBarButtonItems = [addButton, shareButton, deleteButton]
self.dataSource = self
self.delegate = self
self._displayLastNote()
}
fileprivate func _displayLastNote(animated: Bool = false) {
if let note = self._notes.last {
let index = self._notes.count - 1
let vc = self.viewController(note: note, index: index)
self.setViewControllers([vc], direction: .forward, animated: animated)
self._currentIndex = index
}
}
fileprivate func _displayNote(note: Note, animated: Bool = false) {
if let index = self._notes.firstIndex(of: note) {
let vc = self.viewController(note: note, index: index)
self.setViewControllers([vc], direction: .forward, animated: animated)
} else {
print("note not found")
}
}
fileprivate func viewController(note: Note, index: Int) -> NoteViewController {
if let vc = self.storyboard?.instantiateViewController(withIdentifier: "note") as? NoteViewController {
vc.note = note
vc.index = index
return vc
} else {
fatalError("error with storyboard")
}
}
fileprivate func _loadNotes() {
do {
self._notes = try Note.fetchByDate()
if self._notes.isEmpty {
self._createNote()
self._loadNotes()
}
} catch {
print("error = \(error)")
}
}
// MARK: - UIPageViewControllerDataSource
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
guard let vc = viewController as? NoteViewController else {
return nil
}
let previousIndex = vc.index - 1
if previousIndex < 0 {
return nil
}
let note = self._notes[previousIndex]
return self.viewController(note: note, index: previousIndex)
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
guard let vc = viewController as? NoteViewController else {
return nil
}
let nextIndex = vc.index + 1
if nextIndex == self._notes.count {
return nil
}
let note = self._notes[nextIndex]
return self.viewController(note: note, index: nextIndex)
}
func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
if completed, let vc = pageViewController.viewControllers?.first as? NoteViewController {
self._currentIndex = vc.index
}
}
// MARK: - Business
@objc func shareHandler() {
guard let text = self._notes[self._currentIndex].content else {
return
}
let activityViewController = UIActivityViewController(activityItems: [text], applicationActivities: nil)
self.present(activityViewController, animated: true)
}
@objc func addHandler() {
self._createNote()
}
@objc func deleteHandler() {
let note = self._notes[self._currentIndex]
guard let content = note.content else {
self.showAlert(message: "Sorry!", title: "Note not found")
return
}
areYouSure(message: "Do you want to delete this: \(content.prefix(20))...?") {
AppDelegate.viewContext.delete(note)
AppDelegate.shared.saveContext()
self._loadNotes()
self._displayLastNote(animated: true)
}
}
fileprivate func _createNote() {
let note = Note(context: AppDelegate.viewContext)
self._loadNotes()
self._displayNote(note: note)
}
}