【问题标题】:Save and fetch from TextField in CoreData从 CoreData 中的 TextField 保存和获取
【发布时间】: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) 不起作用。参考stackoverflow.com/questions/34322944/…
  • 什么时候出现这个错误?点击提交按钮后?
  • 并尝试将(TextField.text != "") 替换为textField.text != ""。如果错误仍然存​​在,则textFieldDidEndEditing 不会导致错误。
  • 当编辑结束但不是当我点击“保存”按钮时

标签: swift core-data save fetch


【解决方案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)
    }  
}

一些建议:

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

【讨论】:

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