Сохранить и извлечь из TextField в CoreData - PullRequest
0 голосов
/ 10 февраля 2019

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

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:]: нераспознанный селектор отправлен в экземпляр 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
    }
}

1 Ответ

0 голосов
/ 10 февраля 2019

Сохраните itemDetail , а не UITextField .

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

Использовать одно сохранениеfunction :

 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().Вы ничего не сохраняете внутри SaveButton

@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. Ваши имена переменных против Swift рекомендации.Пожалуйста, используйте camelCase .
  2. Не используйте ! (Принудительное приведение) для переменных, вместо этого используйте опциональную цепочку через , если или guard заявлений.
  3. Вы экономите из множества мест.Следуйте принципу DRY .Есть один API для сохранения в CoreData.
  4. saveDetail не должен возвращать bool.Нарушает Command-Query разделение.
...