Я начал изучать программирование и решил попробовать свое первое приложение для заметок.
Моя цель - создать приложение, подобное 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()
}
}