Как я могу создать экземпляр NSManagedObject в NotesApp без кнопки - стиль Apple NoteApp? - PullRequest
1 голос
/ 17 апреля 2020

Я начал изучать программирование и решил попробовать свое первое приложение для заметок.

Моя цель - создать приложение, подобное NoteApp iPhone. Поэтому я хотел, чтобы заголовок заметки был установлен, когда пользователь пишет в TextView в качестве первой строки. Поэтому я создал NoteViewController, который содержит TextView и NoteIndexViewController, который является TableViewController, оба встроены в NavigationController.

Я также использую Базовые данные для хранения данных.

Проблема в том, что я не знаю, как я могу зафиксировать эти изменения в базе данных без использования кнопки. Я знаю, как создать экземпляр NSManagedObject - в NoteIndexViewController для создания новых заметок в TableView с помощью кнопки:

@IBAction func addNotePressed(_ sender: UIBarButtonItem) {

        let newNoteIndex = NoteIndex(context: self.context)
        newNoteIndex.name = "Temporal Name"
        notesArray.append(newNoteIndex)

        saveNoteIndex()

        performSegue(withIdentifier: K.segueToNote, sender: self)
 }

Но я полностью потерялся, если хочу зафиксировать изменения без «кнопки сохранения» для создания экземпляра, а также фиксации изменений. Это код, который я получил до сих пор. Обратите внимание , что я не установил никакой объект Note().


class NoteViewController: UIViewController {
    var noteArray = [Note]()

    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

   var selectedNote: NoteIndex? {
        didSet {
          loadData()
        }
    }

    var firstLine: String?

    @IBOutlet weak var textView: UITextView!


    override func viewDidLoad() {
        super.viewDidLoad()

        loadData()

    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(true)

        if !textView.text.isEmpty {
            if let newLine = textView.text.firstIndex(of: "\n") {
                let firstLetter = textView.text.startIndex
                let lineBrake = textView.text.index(before: newLine)
                let lettersTillPosition = textView.text.distance(from: firstLetter, to: lineBrake)
                firstLine = (textView.text as NSString).substring(to: lettersTillPosition)
            } else {
                if textView.text.count >= 30{
                firstLine = (textView.text as NSString).substring(to: 30)
               } else {
                firstLine = (textView.text as NSString).substring(to: textView.text.count)
               }
           }
            selectedNote!.name = firstLine
            saveCurrentNote()
       }
    }


    //MARK: - Data Manipulation Methods

    func saveCurrentNote() {

        do {
            try context.save()
        } catch {
            print("Error saving cateogry \(error)")
        }
    }

    func loadData(with request: NSFetchRequest<Note> = Note.fetchRequest()) {

// goToIndex is the relationship between the IndexNote entity and Note. And when Back button is pressed the code tend also to break in this part. 


            request.predicate = NSPredicate(format: "goToIndex.name MATCHES %@", selectedNote!.name!)


        do {
            noteArray = try context.fetch(request)
        } catch {
            print("This is a load error: \(error)")
        }
    }
}


extension NoteViewController: UITextViewDelegate {

    func textViewDidChange(_ textView: UITextView) {
        saveCurrentNote()
    }

}

1 Ответ

0 голосов
/ 17 апреля 2020

Вот возможное решение для вашего вопроса. Вы можете использовать Центр уведомлений, чтобы отслеживать, прерван ли пользователь, и если это так, вы можете быстро сохранить его.

Поместите их в делегат сцены

func sceneWillResignActive(_ scene: UIScene) {

        let notificationName = NSNotification.Name(ReuseIdentifier.pause)
        NotificationCenter.default.post(name: notificationName , object: nil)
    }

func sceneDidDisconnect(_ scene: UIScene) {

        let notificationName = NSNotification.Name(ReuseIdentifier.quit)
        NotificationCenter.default.post(name: notificationName, object: nil)
    }

Поместите что-то вроде этого, где сохраняются пользовательские данные.

/// Monitors application state for major changes.
    /// - Pause Observer: Adds observer that notifies application if application is no longer active (enters foreground).
    /// - Quit Observer: Adds observer that notifies application if terminated.
    private func checkForPauseOrQuit(){
        NotificationCenter.default.addObserver(self,
                                               selector: #selector(autoSave),
                                               name: NSNotification.Name(ReuseIdentifier.pause),
                                               object: nil)


        NotificationCenter.default.addObserver(self,
                                               selector: #selector(autoSave),
                                               name: NSNotification.Name(ReuseIdentifier.quit),
                                               object: nil)
    }

И затем для вашего метода селектора вы создаете Ваш NSManagedObject и перехватите любые значения, которые пользователь, возможно, начал печатать.

При запуске вы делаете обратное и обязательно стираете значения. Это должно функционировать только как контейнер временного хранения, а не как ваша основная сущность. Проверьте мою заявку на заметку для справки:

https://github.com/victis23/AwesomeNote/tree/WorkingBranch/AwesomeNote

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...