двоичные данные не извлекаются в UIImageView при вызове - PullRequest
0 голосов
/ 01 февраля 2020

Мой быстрый код ниже использует текстовое поле для ввода числа. При сборке приложения 2 изображения сохраняются в виде двоичных данных ядра. С ним связан индекс для управления порядком сохранения изображений. Когда пользователь вводит 1 в текстовое поле, первое изображение должно появиться при вводе 2. GIF ниже желаемого, которого я хочу достичь.

enter image description here

import UIKit import CoreData

class ViewController: UIViewController,UITextFieldDelegate {


    @IBOutlet var labelName : UILabel!
    @IBOutlet var enterT : UITextField!
    @IBOutlet var pic : UIImageView!
    lazy var context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext


    var dx = [UIImage]()
    var names = [String]()

    override func viewDidLoad() {
        super.viewDidLoad()


        enterT.delegate = self

        pic.backgroundColor = .cyan


        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
        let managedContext = appDelegate.persistentContainer.viewContext
        let entity = NSEntityDescription.entity(forEntityName: "Users", in: managedContext)!
        let item = NSManagedObject(entity: entity, insertInto: managedContext)
             let item2 = NSManagedObject(entity: entity, insertInto: managedContext)
        let fetch = NSFetchRequest<NSFetchRequestResult>(entityName: "Users")

        let vex = UIImage(named: "on.jpg")?.pngData()
        if let data = vex{
            item.setValue(data, forKey: "image")

        }




        let vex2 = UIImage(named: "house.jpg")?.pngData()
        if let data2 = vex2{
            item2.setValue(data2, forKey: "image")
        }




             do {
                 let result = try? managedContext.fetch(fetch) as? [Users]
                 print("Queen",result?.count)
                 try? managedContext.save()



             }
             catch {
                 print("Could not save")
             }


    }


    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

        guard let text = (textField.text as? NSString)?.replacingCharacters(in: range, with: string), let index = Int(text) else { //here....
            // display an alert about invalid text
            return true
        }
        save(at: index )
        return true
    }

    func save(at index : Int) {
        let fetchRequest = NSFetchRequest<Users>(entityName: "Users")
        fetchRequest.predicate = NSPredicate(format: "idx == %d", Int32(index))
        do {
            if let user = try context.fetch(fetchRequest).first {


                pic.image = UIImage(data: user.image ?? Data())
            }
        } catch {
            print("Could not fetch \(error) ")
        }
        return
    }

    @IBAction func add(){


        fetch()
    }



    func fetch()
    {



        for i in 0..<dx.count {
            let newUser = Users(context: context)
            newUser.image = dx[i].jpegData(compressionQuality: 1)
            newUser.idx = Int32(i + 1)


        }



        print("Storing Data..")
        do {
            try context.save()
        } catch {
            print("Storing data Failed", error)
        }
        return
    }


}

1 Ответ

0 голосов
/ 01 февраля 2020

Вы смешиваете извлекаете и сохраняете

  • Когда вы добавляете элементы в базу данных, создаете объекты и сохраняете контекст , Не загружать.
  • При загрузке элементов из базы данных извлекать записи. Не сохраняйте.

Я не знаю, работает ли shouldChangeCharactersIn, как ожидалось. Другой код должен работать.

И снова, при каждом запуске приложения (одинаковые) два элемента снова добавляются в базу данных.

Знайте об этом . Если элементы существуют, удалите или закомментируйте строку populateData() в viewDidLoad.

class ViewController: UIViewController,UITextFieldDelegate {


    @IBOutlet var labelName : UILabel!
    @IBOutlet var enterT : UITextField!
    @IBOutlet var pic : UIImageView!
    lazy var context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

    override func viewDidLoad() {
        super.viewDidLoad()

        enterT.delegate = self

        pic.backgroundColor = .cyan
        populateData()
    }


    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

        guard let text = (textField.text as? NSString)?.replacingCharacters(in: range, with: string), let index = Int(text) else { //here....
            // display an alert about invalid text
            return true
        }
        loadImage(at: index )
        return true
    }

    func loadImage(at index : Int) {
        let fetchRequest = NSFetchRequest<Users>(entityName: "Users")
        fetchRequest.predicate = NSPredicate(format: "idx == %d", Int32(index))
        do {
            if let user = try context.fetch(fetchRequest).first {
                pic.image = UIImage(data: user.image!)
            } else {
               pic.image = nil
            }
        } catch {
            print("Could not fetch \(error) ")
        }
    }

    @IBAction func add(){
        // fetch()
    }

    func populateData()
    {
        let item = Users(context: context)
        let vex = UIImage(named: "on.jpg")!.pngData()
        item.image = vex
        item.idx = 1

        let item2 = Users(context: context)
        let vex2 = UIImage(named: "house.jpg")!.pngData()
        item2.image = vex2
        item2.idx = 2

        print("Storing Data..")
        do {
            try context.save()
        } catch {
            print("Storing data Failed", error)
        }
    }
}
...