сохранить uiimageview в coredata как бинарные данные Swift (5) - PullRequest
0 голосов
/ 29 мая 2019

Я пытаюсь сохранить изображение в виде изображения в двоичные данные в основных данных. Мой код не работает. Имеется ошибка компиляции. В контроллере View он не регистрируется cdHandler. Все, что я хочу сделать, это сохранить imaveview как двоичные данные в базовой модели данных. У меня есть 2 класса, делегат приложения и контроллер представления.

КОНТРОЛЛЕР ПРОСМОТРА КЛАССА

    import UIKit
import CoreData

class ViewController: UIViewController {
var canVasView = UIImageView()
@objc func hhh() {
    let photo = self.canVasView.image
    let data = photo!.pngData()

    if cdHandler.saveObject(pic:  data!){
    }
}
}

Приложение DELEGATE

  import UIKit
import CoreData

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

var window: UIWindow?


     lazy var persistentContainer: NSPersistentContainer = {
         /*
          The persistent container for the application. This implementation
          creates and returns a container, having loaded the store for the
          application to it. This property is optional since there are legitimate
          error conditions that could cause the creation of the store to fail.
          */
         let container = NSPersistentContainer(name: "Model")
         container.loadPersistentStores(completionHandler: { (storeDescription, error) in
             if let error = error as NSError? {
                 // Replace this implementation with code to handle the error appropriately.
                 // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.

            /*
             Typical reasons for an error here include:
             * The parent directory does not exist, cannot be created, or disallows writing.
             * The persistent store is not accessible, due to permissions or data protection when the device is locked.
             * The device is out of space.
             * The store could not be migrated to the current model version.
             Check the error message to determine what the actual problem was.
             */
            fatalError("Unresolved error \(error), \(error.userInfo)")
        }
    })
    return container
}()
class cdHandler: NSObject {

    private class func getContext() -> NSManagedObjectContext {
        let appdeleagetzz = UIApplication.shared.delegate as! AppDelegate
        return appdeleagetzz.persistentContainer.viewContext
    }
    class func saveObject(pic: Data, userName: String) -> Bool {
        let context = getContext()
        let entity = NSEntityDescription.entity(forEntityName: "User", in: context)
        let managedObject = NSManagedObject(entity: entity!, insertInto: context)
        managedObject.setValue(pic, forKey:"pic")
        managedObject.setValue(userName, forKey:"userName")
        do {
            try context.save()
            return true

        } catch {
            return false

        }
    }
    class func deletObject(user: User) -> Bool {
        let context = getContext()
        context.delete(user)

        do {
            try context.save()
            return true
        } catch {
            return false

        }
    }

    class func fetchObject() -> [User]? {

        do {
            let context = getContext()
            return try context.fetch(User.fetchRequest())
        } catch {
            return [User]()
        }
    }

}
}

enter image description here

1 Ответ

0 голосов
/ 29 мая 2019

Сообщение об ошибке, * Значение типа «AppDelegate» не имеет члена с именем «persistentContainer», объясняет проблему.Действительно, когда я смотрю на код для вашего AppDelegate класса, я могу подтвердить, что в нем нет члена с именем persistentContainer.(Если я правильно читаю, две последние строки в файле закрывают фигурные скобки. Первая закрывает ваш cdHandler вложенный класс, а вторая закрывает ваш AppDelegate класс.)

Doследующее упражнение.В XCode, нажмите в меню: Файл > Новый проект и выберите iOS , Приложение и Single View App .Назовите ваш новый проект Хлам .Установите флажок Базовые данные .Нажмите кнопку Создать .После того, как это сделано, посмотрите на AppDelegate.swift, который создал XCode, и в классе AppDelegate вы увидите, что он содержит 8 функций (func).Седьмой lazy var persistentContainer.Ага!Компилятор говорит вам, что вы, вероятно, не должны были удалять эти 8 функций, в частности persistentContainer, в частности .

. Вы должны скопировать этот persistentContainer func из этого Junk проект в ваш AppDelegate класс в вашем реальном проектеИли, чтобы избежать будущих неприятностей, рассмотрите возможность копирования большинства других 7 функций.Как вы можете видеть, большинство из них ничего не делают, кроме как предоставить комментарии с объяснениями, которые полезны для начинающих.После завершения копирования закройте проект Junk .(Я перезаписываю свой проект Junk новым проектом Junk несколько раз в неделю, особенно когда отвечаю на вопросы StackOverflow.)

Это должно исправить эту конкретную ошибку иответь на этот вопросВперед к следующему вопросу.:)

Ответ на комментарий, что вы все еще получаете ошибку с cdHandler

Не имея ничего другого, я предполагаю, что ошибка , чтоВы ссылаетесь на ошибку компилятора, все еще на вашем скриншоте.Другими словами, вы говорите, что добавление определения persistentContainer не улучшило его.

Ну, это работает для меня.Пожалуйста, замените весь код в вашем AppDelegate.swift классе следующим, соберите и запустите его ...

import UIKit
import CoreData

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        AppDelegate.cdHandler.testGetContext()
        return true
    }

    lazy var persistentContainer: NSPersistentContainer = {
        /*
         The persistent container for the application. This implementation
         creates and returns a container, having loaded the store for the
         application to it. This property is optional since there are legitimate
         error conditions that could cause the creation of the store to fail.
         */
        let container = NSPersistentContainer(name: "Junk")
        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            if let error = error as NSError? {
                // Replace this implementation with code to handle the error appropriately.
                // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.

                /*
                 Typical reasons for an error here include:
                 * The parent directory does not exist, cannot be created, or disallows writing.
                 * The persistent store is not accessible, due to permissions or data protection when the device is locked.
                 * The device is out of space.
                 * The store could not be migrated to the current model version.
                 Check the error message to determine what the actual problem was.
                 */
                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
        })
        return container
    }()

    class cdHandler: NSObject {

        private class func getContext() -> NSManagedObjectContext {
            let appdeleagetzz = UIApplication.shared.delegate as! AppDelegate
            return appdeleagetzz.persistentContainer.viewContext
        }

        class func testGetContext() {
            let context = getContext()
            print("getContext() succeeded, got \(context)")
        }

        class func saveObject(pic: Data, userName: String) -> Bool {
            let context = getContext()
            let entity = NSEntityDescription.entity(forEntityName: "User", in: context)
            let managedObject = NSManagedObject(entity: entity!, insertInto: context)
            managedObject.setValue(pic, forKey:"pic")
            managedObject.setValue(userName, forKey:"userName")
            do {
                try context.save()
                return true

            } catch {
                return false

            }
        }
        class func deletObject(user: NSManagedObject) -> Bool {
            let context = getContext()
            context.delete(user)

            do {
                try context.save()
                return true
            } catch {
                return false

            }
        }

    }
}

Вы видите, что компилируется без ошибок.Кроме того, он запускается, и метод AppDelegate.cdhandler.getContext () работает.Как видите, в AppDelegate.application(application:didFinishLaunchingWithOptions:), I have added a call to a new method which I defined later, AppDelegate.cdHandler.testGetContext () `.Он отлично работает.

Вы получаете другую ошибку сейчас?Если это так, вам нужно указать, является ли это ошибка сборки или запуска.В любом случае скопируйте и вставьте текст ошибки в свой вопрос и сообщите нам, где она произошла.

...