Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何保存和显示包含核心数据的图像-swift 3_Swift_Xcode_Swift3_Xcode8 - Fatal编程技术网

如何保存和显示包含核心数据的图像-swift 3

如何保存和显示包含核心数据的图像-swift 3,swift,xcode,swift3,xcode8,Swift,Xcode,Swift3,Xcode8,我在swift3-xcode 8中做一个项目,我试图使用核心数据在数据库表“users”中保存和显示一些图像。 此图像是用户个人资料中的照片 现在我已经成功地保存了字符串并从核心数据中显示它们,但是我在用图像解决这个问题时遇到了问题 这就是我到目前为止所做的: 将用户添加到核心数据中 func addUser() { let app = UIApplication.shared.delegate as! AppDelegate let context = app.persiste

我在
swift3
-
xcode 8
中做一个项目,我试图使用核心数据在数据库表“users”中保存和显示一些图像。 此图像是用户个人资料中的照片

现在我已经成功地保存了字符串并从核心数据中显示它们,但是我在用图像解决这个问题时遇到了问题

这就是我到目前为止所做的:

将用户添加到核心数据中

func addUser() {
    let app = UIApplication.shared.delegate as! AppDelegate
    let context = app.persistentContainer.viewContext
    let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Users")
    request.returnsObjectsAsFaults = false

    let newUser = NSEntityDescription.insertNewObject(forEntityName: "Users", into: context)

    if (firstName.text == "" && lastName.text == "" && contact.text == "" && email.text == "") { //if we have a user profile delete it
        deleteUser()
    } else { // add a new user profile
        newUser.setValue(firstName.text, forKey: "firstName")
        newUser.setValue(lastName.text, forKey: "lastName")
        newUser.setValue(contact.text, forKey: "contact")
        newUser.setValue(email.text, forKey: "email")

        //newUser.setValue(imageView.image, forKey: "photo")
        //let imgUrl = UIImagePickerControllerReferenceURL as! NSURL
        let img = UIImage(named: "f.png")
        let imgData = UIImageJPEGRepresentation(img!, 1)

        newUser.setValue(imgData, forKey: "photo")

        print ("Data added in Users")
    }
    do {
        try context.save()
        //print("saved!!!")
        Alert.show(title: "Success", message: "Profile Saved", vc: self)
    } catch {
       // print ("Error")
        Alert.show(title: "Error", message: "Profile not Saved", vc: self)
    }
}
我无法显示已保存的图像。 你有什么建议吗


编辑:Xcode向我发送消息“与assetsd的连接被中断或assetsd死亡”

用户的属性
照片
(NS)数据
,正如您在那里所做的那样,转换

UIImage
转换成
NSData

let img = UIImage(named: "f.png")
let imgData = UIImageJPEGRepresentation(img!, 1)
newUser.setValue(imgData, forKey: "photo")
当您检索信息时,您的操作就像
photo
UIImage
对象:

if let photoinData = result.value(forKey: "photo") as? UIImage{
    imageView.image = photoinData
}
根据前面的行,这是不符合逻辑的。应该是这样的:

if let imageData = result.value(forKey: "photo") as? NSData {
    if let image = UIImage(data:imageData) as? UIImage {
        imageView.image = image
    }
}

注意:我不会说Swift,因此建议的代码可能无法编译,但您应该知道哪里出了问题,需要做什么。

希望我能帮助您。我干得不错

var results :[Any] = []

let image = UIImage(named: "image.png")
        //this is the line that appears to be wrong
        let imageData = UIImagePNGRepresentation(image!) as NSData?



        guard let appDelegate =
            UIApplication.shared.delegate as? AppDelegate else {
                return
        }


        // 1
        let managedContext =
            appDelegate.persistentContainer.viewContext

        // 2
        let entity =
            NSEntityDescription.entity(forEntityName: "Image",
                                       in: managedContext)!

        let person = NSManagedObject(entity: entity,
                                     insertInto: managedContext)

        // 3
        person.setValue(imageData, forKeyPath: "name")

        // 4
        do {
            try managedContext.save()
            results.append(person)


        } catch let error as NSError {
            print("Could not save. \(error), \(error.userInfo)")
        }

Larme几乎把它放在了正确的位置上,但不是这个:

if let image = UIImage(data:imageData) as? UIImage
这样做:

if let image = UIImage(data: imageData as Data)

希望这对你有帮助。首先,我也对将图像存储在核心数据中感到非常困惑

这用于将图像保存在coreData中

首先创建托管对象类

class Item: NSManagedObject {


}

Declare the image as NSData

import CoreData

extension Item {

    @NSManaged var image: NSData?
    @NSManaged var name: String?
    @NSManaged var email: String?

}
现在转到要保存图像的视图控制器

class newViewController: UIViewController ,UIImagePickerControllerDelegate,UINavigationControllerDelegate{

 var item : Item? = nil

    var imagePicker = UIImagePickerController()

    var PassImages = UIImage()

    @IBOutlet var name: UITextField!

    @IBOutlet var email: UITextField!

    @IBOutlet var photoclick: UIButton!

        var context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext


    @IBAction func clickaction(_ sender: Any) {

        if UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.photoLibrary){
            print("Button capture")

            let picker = UIImagePickerController()
            picker.allowsEditing = true
            picker.sourceType = .photoLibrary
            picker.delegate = self  //Don't forget this line!
            self.present(picker, animated: true, completion: nil)


        }
    }


    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {

        var selectedImage: UIImage?
        if let editedImage = info[.editedImage] as? UIImage {
            selectedImage = editedImage
            self.image.image = selectedImage!
            picker.dismiss(animated: true, completion: nil)
        } else if let originalImage = info[.originalImage] as? UIImage {
            selectedImage = originalImage
            self.image.image = selectedImage!
            picker.dismiss(animated: true, completion: nil)
        }

    }


    func imagePickerControllerDidCancel(picker: UIImagePickerController!) {

        self.dismiss(animated: true, completion: nil)
    }

    @IBOutlet var image: UIImageView!=nil


    @IBAction func submit(_ sender: Any) {

        if name.text != "" && email.text != ""
        {

            let entityDescription = NSEntityDescription.entity(forEntityName: "Table", in: context)

            let item = Item(entity: entityDescription!, insertInto: context)

            item.name = name.text
            item.email = email.text

            item.image = image.image!.pngData()! as NSData

            do {
                try context.save()
                print("saved this moc")
            } catch {
                return
            }

 let UserDetailsVc = self.storyboard?.instantiateViewController(withIdentifier: "ViewController") as! ViewController

            self.navigationController?.pushViewController(UserDetailsVc, animated: true)

        }
        else
        {
            print("mail check")
            let alertController1 = UIAlertController (title: "Fill Email id", message: "Enter valid email", preferredStyle: UIAlertController.Style.alert)

            alertController1.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
            present(alertController1, animated: true, completion: nil)
        }
    }

override func viewDidLoad() {

        super.viewDidLoad()

        if item != nil {
            name.text = item?.name
            email.text = item?.email
            image.image = UIImage(data: (item?.image)! as Data)
        }
    }
此控制器用于获取所有内容

class ViewController: UIViewController ,UITableViewDataSource,UITableViewDelegate,NSFetchedResultsControllerDelegate{

    var userarray: [Table] = []

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return userarray.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell", for: indexPath) as! TableViewCell

        let name = userarray[indexPath.row]
        cell.username.text = name.name

        cell.showImage?.image = UIImage(data: (name.image)!)

         return cell
    }

    @IBOutlet var table: UITableView!
    override func viewDidLoad() {
        super.viewDidLoad()

        fetchData()
    }

    override func viewWillAppear(_ animated: Bool) {
        fetchData()
    }

    func fetchData(){

        let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

        do {
            userarray = try context.fetch(Table.fetchRequest())
            print(userarray,"user")

        }catch{
            print("error")
        }

    }

}

您为属性
photo
保存了
(NS)数据
对象,而不是
UIImage
对象。所以我猜:
如果让photoinData=result.value(forKey:“photo”)为?NSData{imageView.image=UIImage(data:photoinData);}
,或者类似的东西应该可以工作。我做到了,它可以工作。非常感谢:)如果让photoinData=result.value(forKey:“photo”)作为?NSData{ImageView.image=UIImage(数据:photoinData as data)}还有一个问题:我正在插入一个用户用imagePickerController从手机中选择的图像。如何添加该图像?(而不是f.png)?类似的方法?
class ViewController: UIViewController ,UITableViewDataSource,UITableViewDelegate,NSFetchedResultsControllerDelegate{

    var userarray: [Table] = []

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return userarray.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell", for: indexPath) as! TableViewCell

        let name = userarray[indexPath.row]
        cell.username.text = name.name

        cell.showImage?.image = UIImage(data: (name.image)!)

         return cell
    }

    @IBOutlet var table: UITableView!
    override func viewDidLoad() {
        super.viewDidLoad()

        fetchData()
    }

    override func viewWillAppear(_ animated: Bool) {
        fetchData()
    }

    func fetchData(){

        let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

        do {
            userarray = try context.fetch(Table.fetchRequest())
            print(userarray,"user")

        }catch{
            print("error")
        }

    }

}