Сообщение об ошибке, * Значение типа «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 () `.Он отлично работает.
Вы получаете другую ошибку сейчас?Если это так, вам нужно указать, является ли это ошибка сборки или запуска.В любом случае скопируйте и вставьте текст ошибки в свой вопрос и сообщите нам, где она произошла.