Я хочу сохранить и получить данные из текстового поля. Мой код выглядит так:
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
}
}
функция textFieldDidEndEditing(textField: UITextField) не работала. Ссылаясь на stackoverflow.com/questions/34322944/…
Когда вы получаете эту ошибку? После нажатия кнопки отправки?
И попробуйте заменить (TextField.text != "") на textField.text != "". и если ошибка все еще сохраняется, textFieldDidEndEditing не вызывает ошибку.
Когда редактирование заканчивается, но не когда я нажимаю кнопку «Сохранить»
Все та же ошибка
Добавлены функции сохранения и извлечения выше
manageObject.setValue(UITextField.self, forKey: "itemDetail"). Разве вы не должны сохранять текст вместо самого UITextField?





Сохраните элементдеталь, а не сам 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)
}
}
Некоторые советы:
Я думаю, что ошибка возникла из-за неиспользованного «TextViewIO». Но сохранить пока не получается. Еще один совет?
TextViewIO не имеет отношения. В любом случае ошибка устранена? Вы пробовали вышеуказанное решение? Я думаю, вам нужно обновить свой вопрос, если у вас другая проблема.
Ну, не решено, я все еще не могу сохранить данные из/в TextField, но ошибка исчезла. Спасибо за вашу помощь и советы. Очень ценю. Спасибо!
@Winz Вы используете TextField.text == "" и сохраняете его? Я думаю, что есть логическая ошибка.
Разве это не должен делать func textFieldDidEndEditing(_ textField: UITextField)?
Вопрос 1: Можно ли сохраниться при нажатии SaveButton? Если нет, то ваш TextField.text == "" вызывает логическую ошибку. См. Обновление ответа 2.
Ах да, "TextField.text == "" и сохранить его", это неправильно, но все равно не работает без запроса if.
Используйте if, но исправьте логическую ошибку и удалите повторяющиеся и ненужные коды под ней. Проверьте мой ответ.
Кнопка сохранения не работает. Функция Func textFieldDidEndEditing больше недоступна
@Winz Я обновил свой ответ одной функцией saveDetail. Используйте его везде, где вы пытаетесь сохранить itemDetail. Я протестировал его, и он работает.
Хорошо, у меня было время проверить, и теперь кое-что сохранено. Но TextField показывает только [<ItemDetail: 0x6040002890b0> (entity: ItemDetail; id: 0xd000000000040002 <x-coredata://4A34A20C-5A8B-41DC-7D49-30700657D8F9/ItemDetail/p1>; data: <fault>]" ?
@Winz Можете ли вы опубликовать свой ItemDetail.fetchRequest?
currentTextField = textFieldпочему это? Поскольку у вас естьTextField.