Сохранение и выборка из TextField в CoreData

Я хочу сохранить и получить данные из текстового поля. Мой код выглядит так:

import UIKit
import CoreData

class DetailViewController: UIViewController, UITextViewDelegate {
private var currentTextField: UITextField?

var Detail: [NSManagedObject] = [ ]

@IBOutlet weak var TableViewDetail: UITextView!   
@IBOutlet weak var LabelDetail: UILabel!  
@IBOutlet weak var TextField: UITextField!  

Кнопка Сохранить:

@IBAction func SaveButton(_ sender: Any) {    
    if (TextField.text ==  "") {
        self.save2(TextField.text!)
    }

    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {return}
    let managedContext = appDelegate.persistentContainer.viewContext

    do {

        try managedContext.save()

    } catch let err as NSError {
        print("Cant save arrangement", err)
    }

    print("TextFieldEditingEnd2")
}

Это необходимо?

@IBAction func Submit(sender: UIButton) {
    if let currentTextField = currentTextField {
        currentTextField.resignFirstResponder()
    }
}

Я думаю, вот ошибка:

func textFieldDidEndEditing(_ textField: UITextField) {
    if (TextField.text !=  "")
    {
        currentTextField = textField
        print("TextFieldEditingEnd2")
        if  CoreDataHandler.saveDetail(itemDetail: (currentTextField?.text!)!) {
        for item in CoreDataHandler.fetchDetail()!  {
            print("\(String(describing: item.itemDetail))")
            }}
    }
}


override func viewDidLoad() {
    super.viewDidLoad()

    TextField.delegate = self as? UITextFieldDelegate
    // Do any additional setup after loading the view.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

override func viewWillAppear(_ animated: Bool) {
    // func viewDidload(_ animated: Bool) {    
}

func textFieldShouldReturn(textField: UITextField) -> Bool {
    // User finished typing (hit return): hide the keyboard.
    textField.resignFirstResponder()
    return true
}

Функция сохранения

func save2(_ itemName: String){

    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
    let managedContext = appDelegate.persistentContainer.viewContext
    let entity = NSEntityDescription.entity(forEntityName: "ItemDetail", in: managedContext)!
    let showItemDetail = NSManagedObject(entity: entity, insertInto: managedContext)

    showItemDetail.setValue(itemName, forKey: "itemDetail")

    do {
        try managedContext.save()
    } catch let err as NSError {
        print("Failed to save item",err) 
    }

}

Ошибка

[SmallApps.DetailViewController TextFieldIO:]: unrecognized selector sent to instance 0x7fad6de3dc10'

*** Стек вызовов первого броска:"

У кого-нибудь есть совет?

Обновлено: Функции сохранения и извлечения:

Сохранять:

class func saveDetail(itemDetail: String) -> Bool {
    let context = getContext()
    let entity = NSEntityDescription.entity(forEntityName: "ItemDetail", in: context)
    let manageObject = NSManagedObject(entity: entity!, insertInto: context)
    manageObject.setValue(UITextField.self, forKey: "itemDetail")
    do {
        try context.save()
        return true
    }catch {
        return false
    }
}

принести:

class func fetchDetail() -> [ItemDetail]? {
    let context = getContext()
    var showItemDetail:[ItemDetail]? = nil
    do {
        showItemDetail = try context.fetch(ItemDetail.fetchRequest())
        return showItemDetail
    }catch {
        return showItemDetail
    }
}
currentTextField = textField почему это? Поскольку у вас есть TextField.
prex 10.02.2019 04:32

функция textFieldDidEndEditing(textField: UITextField) не работала. Ссылаясь на stackoverflow.com/questions/34322944/…

Winz 10.02.2019 04:37

Когда вы получаете эту ошибку? После нажатия кнопки отправки?

prex 10.02.2019 04:42

И попробуйте заменить (TextField.text != "") на textField.text != "". и если ошибка все еще сохраняется, textFieldDidEndEditing не вызывает ошибку.

prex 10.02.2019 04:48

Когда редактирование заканчивается, но не когда я нажимаю кнопку «Сохранить»

Winz 10.02.2019 04:52

Все та же ошибка

Winz 10.02.2019 04:55

Добавлены функции сохранения и извлечения выше

Winz 10.02.2019 05:01
manageObject.setValue(UITextField.self, forKey: "itemDetail"). Разве вы не должны сохранять текст вместо самого UITextField?
prex 10.02.2019 05:17
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
8
804
1

Ответы 1

Сохраните элементдеталь, а не сам UITextField.

Для: textFieldDidEndEditing, который вызывает CoreHandler.saveDetail

Используйте одну функцию сохранения:

 func saveDetail(itemDetail: String) {
    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return false }
    let context = appDelegate.persistentContainer.viewContext
    let entity = NSEntityDescription.entity(forEntityName: "ItemDetail", in: context)
    let manageObject = NSManagedObject(entity: entity!, insertInto: context)
    manageObject.setValue(itemDetail, forKey: "itemDetail")
    do {
        try context.save()
    } catch {
        .. handle catch
    }
}

Для SaveButton, который вызывает функцию save2(). Вы ничего не сохраняете внутри СохранитьКнопка

@IBAction func SaveButton(_ sender: Any) { 
    // You are comparing TextField.text == "" and saving? If text is not empty you are trying to save. So use != 
    if let text = TextField.text, text != "" { 
        saveDetail(itemDetail: text)
    }  
}

Некоторые советы:

  1. Ваши имена переменных не соответствуют правилам Быстрый. Пожалуйста, используйте верблюдЧехол.
  2. Не используйте !(принудительное приведение) для переменных, вместо этого используйте необязательную цепочку с помощью операторов если или сторожить.
  3. Вы экономите много мест. Следуйте принципу СУХОЙ. Иметь один API для сохранения в CoreData.
  4. сохранитьПодробнее не должен возвращать логическое значение. Нарушает разделение Команда-запрос.

Я думаю, что ошибка возникла из-за неиспользованного «TextViewIO». Но сохранить пока не получается. Еще один совет?

Winz 10.02.2019 05:39

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

prex 10.02.2019 05:42

Ну, не решено, я все еще не могу сохранить данные из/в TextField, но ошибка исчезла. Спасибо за вашу помощь и советы. Очень ценю. Спасибо!

Winz 10.02.2019 05:47

@Winz Вы используете TextField.text == "" и сохраняете его? Я думаю, что есть логическая ошибка.

prex 10.02.2019 06:03

Разве это не должен делать func textFieldDidEndEditing(_ textField: UITextField)?

Winz 10.02.2019 06:12

Вопрос 1: Можно ли сохраниться при нажатии SaveButton? Если нет, то ваш TextField.text == "" вызывает логическую ошибку. См. Обновление ответа 2.

prex 10.02.2019 06:14

Ах да, "TextField.text == "" и сохранить его", это неправильно, но все равно не работает без запроса if.

Winz 10.02.2019 06:19

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

prex 10.02.2019 06:20

Кнопка сохранения не работает. Функция Func textFieldDidEndEditing больше недоступна

Winz 10.02.2019 06:21

@Winz Я обновил свой ответ одной функцией saveDetail. Используйте его везде, где вы пытаетесь сохранить itemDetail. Я протестировал его, и он работает.

prex 10.02.2019 07:06

Хорошо, у меня было время проверить, и теперь кое-что сохранено. Но TextField показывает только [<ItemDetail: 0x6040002890b0> (entity: ItemDetail; id: 0xd000000000040002 <x-coredata://4A34A20C-5A8B-41DC-7D49-30700657D8F9/ItemDetai‌​l/p1>; data: <fault>]" ?

Winz 11.02.2019 19:39

@Winz Можете ли вы опубликовать свой ItemDetail.fetchRequest?

prex 12.02.2019 00:16

Другие вопросы по теме