从 CoreData 中的 TextField 保存和获取

Posted

技术标签:

【中文标题】从 CoreData 中的 TextField 保存和获取【英文标题】:Save and fetch from TextField in CoreData 【发布时间】:2019-02-10 03:25:51 【问题描述】:

我想从 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
    

【问题讨论】:

currentTextField = textField 为什么会这样?因为你有TextField func textFieldDidEndEditing(textField: UITextField) 不起作用。参考***.com/questions/34322944/… 什么时候出现这个错误?点击提交按钮后? 并尝试将(TextField.text != "") 替换为textField.text != ""。如果错误仍然存​​在,则textFieldDidEndEditing 不会导致错误。 当编辑结束但不是当我点击“保存”按钮时 【参考方案1】:

保存 itemDetail 而不是 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
    

对于正在调用save2() 函数的SaveButton。 您没有在 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)
      

一些建议:

    您的变量名违反了Swift准则。请用 驼峰式。 不要对变量使用 !(force cast),而是通过 ifguard 语句使用可选链接。 您正在从很多地方进行储蓄。遵循DRY原则。有一个 API 可以保存到 CoreData。 saveDetail 不应返回 bool。违反 Command-Query 分离。

【讨论】:

我认为错误是由于未使用的“TextViewIO”而产生的。但是保存还不起作用。另一个提示? TextViewIO 不相关。无论如何,错误解决了吗?您是否尝试过上述解决方案?如果您有其他问题,我认为您需要更新您的问题。 好吧,没有解决,我仍然无法将数据从/保存到 TextField,但错误消失了。感谢您的帮助和建议。非常赞赏。谢谢! @Winz 您正在使用 TextField.text == "" 并保存它?我认为有一个逻辑错误。 不应该由func textFieldDidEndEditing(_ textField: UITextField)完成吗?

以上是关于从 CoreData 中的 TextField 保存和获取的主要内容,如果未能解决你的问题,请参考以下文章

从 coredata 表中检索数据到 UIPickerView(在 textField 内)

SwiftUI:如何从核心数据中的 TextField 中保存值

CoreData TextField - 意外发现 nil

带有 CoreData 的 TextField

在插入Core Data之前检查textfield是否为空

编辑 Core Data 类实例字符串时,SwiftUI List 中的 TextField 出现光标定位错误?