From a7c664a2ae4162fafe7238e58441bafaf6d1cbc7 Mon Sep 17 00:00:00 2001 From: Min Hyun Date: Tue, 5 Sep 2023 15:20:15 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20UITextViewDelegate=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80,=20=EC=9D=BC=EA=B8=B0=20=EC=9E=90=EB=8F=99=20?= =?UTF-8?q?=EC=A0=80=EC=9E=A5=20=EA=B8=B0=EB=8A=A5=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Diary/App/SceneDelegate.swift | 2 +- .../CreateDiaryViewController.swift | 62 ++++++++++--------- Diary/DataManager/CoreDataManager.swift | 10 +-- 3 files changed, 35 insertions(+), 39 deletions(-) diff --git a/Diary/App/SceneDelegate.swift b/Diary/App/SceneDelegate.swift index 608a4b0d5..9df239af5 100644 --- a/Diary/App/SceneDelegate.swift +++ b/Diary/App/SceneDelegate.swift @@ -49,7 +49,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { // 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() + CoreDataManager.shared.saveContext() } diff --git a/Diary/Controller/CreateDiaryViewController.swift b/Diary/Controller/CreateDiaryViewController.swift index 133570d1a..9a752d6f2 100644 --- a/Diary/Controller/CreateDiaryViewController.swift +++ b/Diary/Controller/CreateDiaryViewController.swift @@ -17,15 +17,18 @@ final class CreateDiaryViewController: UIViewController, AlertDisplayable, Share }() private let container = CoreDataManager.shared.persistentContainer - var diary: Diary? + var diary: Diary + var isNew: Bool init() { self.diary = CoreDataManager.shared.createDiary() + self.isNew = true super.init(nibName: nil, bundle: nil) } init(_ diary: Diary) { self.diary = diary + self.isNew = false super.init(nibName: nil, bundle: nil) } @@ -40,18 +43,16 @@ final class CreateDiaryViewController: UIViewController, AlertDisplayable, Share setupNavigationBarButton() setupNotification() } - - override func viewWillDisappear(_ animated: Bool) { - super.viewWillDisappear(animated) - if diary != nil { - saveDiary() - } - } - + private func configureUI() { view.backgroundColor = .systemBackground self.title = DateFormatter().formatToString(from: Date(), with: "YYYY년 MM월 dd일") view.addSubview(textView) + textView.delegate = self + + if isNew { + textView.becomeFirstResponder() + } NSLayoutConstraint.activate([ textView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor), @@ -62,8 +63,7 @@ final class CreateDiaryViewController: UIViewController, AlertDisplayable, Share } private func setupBodyText() { - guard let diary, - let title = diary.title, + guard let title = diary.title, let body = diary.body else { return } @@ -94,28 +94,13 @@ final class CreateDiaryViewController: UIViewController, AlertDisplayable, Share let cancelAction = UIAlertAction(title: "취소", style: .cancel) let deleteAction = UIAlertAction(title: "삭제", style: .destructive) { [weak self] _ in guard let self else { return } - self.deleteDiary(self.diary) + CoreDataManager.shared.deleteDiary(diary) self.navigationController?.popViewController(animated: true) } showAlert(title: "진짜요?", message: "정말로 삭제하시겠어요?", actions: [cancelAction, deleteAction]) } - - private func saveDiary() { - let contents = textView.text.split(separator: "\n") - guard !contents.isEmpty, - let title = contents.first else { return } - - let body = contents.dropFirst().joined(separator: "\n") - - CoreDataManager.shared.saveDiary(title: "\(title)", body: body, diary: diary) - } - - private func deleteDiary(_ diary: Diary?) { - CoreDataManager.shared.deleteDiary(diary) - self.diary = nil - } - + deinit { NotificationCenter.default.removeObserver(self) } @@ -153,6 +138,25 @@ extension CreateDiaryViewController { @objc private func keyboardWillHide(_ notification: Notification) { textView.contentInset = .zero - saveDiary() + } +} + +extension CreateDiaryViewController: UITextViewDelegate { + func textViewDidEndEditing(_ textView: UITextView) { + let contents = textView.text.split(separator: "\n") + guard !contents.isEmpty else { return } + + CoreDataManager.shared.saveContext() + } + + func textViewDidChange(_ textView: UITextView) { + let contents = textView.text.split(separator: "\n") + guard !contents.isEmpty, + let title = contents.first else { return } + + let body = contents.dropFirst().joined(separator: "\n") + + diary.title = "\(title)" + diary.body = body } } diff --git a/Diary/DataManager/CoreDataManager.swift b/Diary/DataManager/CoreDataManager.swift index 737eb6e7d..d4f7f6de6 100644 --- a/Diary/DataManager/CoreDataManager.swift +++ b/Diary/DataManager/CoreDataManager.swift @@ -11,7 +11,7 @@ class CoreDataManager { static let shared = CoreDataManager() private init() {} - func createDiary() -> Diary? { + func createDiary() -> Diary { let newDiary = Diary(context: persistentContainer.viewContext) newDiary.id = UUID() newDiary.createdAt = Date() @@ -19,14 +19,6 @@ class CoreDataManager { return newDiary } - func saveDiary(title: String, body: String, diary: Diary?) { - guard let diary else { return } - diary.title = title - diary.body = body - - saveContext() - } - func deleteDiary(_ diary: Diary?) { if let diary = diary { persistentContainer.viewContext.delete(diary)