从 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),而是通过 if 或 guard 语句使用可选链接。
您正在从很多地方进行储蓄。遵循DRY原则。有一个 API 可以保存到 CoreData。
saveDetail 不应返回 bool。违反 Command-Query 分离。
【讨论】:
我认为错误是由于未使用的“TextViewIO”而产生的。但是保存还不起作用。另一个提示? TextViewIO 不相关。无论如何,错误解决了吗?您是否尝试过上述解决方案?如果您有其他问题,我认为您需要更新您的问题。 好吧,没有解决,我仍然无法将数据从/保存到 TextField,但错误消失了。感谢您的帮助和建议。非常赞赏。谢谢! @Winz 您正在使用 TextField.text == "" 并保存它?我认为有一个逻辑错误。 不应该由func textFieldDidEndEditing(_ textField: UITextField)
完成吗?以上是关于从 CoreData 中的 TextField 保存和获取的主要内容,如果未能解决你的问题,请参考以下文章
从 coredata 表中检索数据到 UIPickerView(在 textField 内)