调用时无法在UIImageView中获取二进制数据 [英] binary data not fetching in UIImageView when called

查看:109
本文介绍了调用时无法在UIImageView中获取二进制数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我下面的快捷代码正在使用文本字段输入数字.应用构建时,将2张图像保存到核心数据二进制数据图像中.有一个与之相连的索引来控制图像保存方式的顺序.当用户在文本字段中输入1时,输入2时应显示第一个图像.我要实现的愿望下面是一个gif.

My swift code below is using a textfield to enter a number. When the app builds 2 images are saved to core data binary data image. There is a index connected to it to control the order of the way the images are saved. When the user enters 1 in the textfield the 1st image should appear when 2 is entered. A gif is below of want I want to achieve.

导入UIKit 导入CoreData

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
    }


}

推荐答案

您正在混淆获取保存

  • 将项目添加到数据库时,创建对象并保存.不要获取.
  • 从数据库中加载项目时,获取记录.不要保存.
  • When you add items to the database create objects and save the context. Don't fetch.
  • When you load items from the database fetch the records. Don't save.

我不知道shouldChangeCharactersIn是否按预期工作.其他代码应该可以工作.

I don't know if shouldChangeCharactersIn works as expected. The other code is supposed to work.

再一次,在每个应用程序启动时,(相同)两项将再次添加到数据库中.

请注意.如果项目存在,请删除或注释viewDidLoad中的populateData()行.

Be aware of that. If the items exist delete or comment out the line populateData() in 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)
        }
    }
}

这篇关于调用时无法在UIImageView中获取二进制数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆