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 将图像加载到核心数据中的相册时出现问题_Swift_Xcode_Core Data_Nspredicate - Fatal编程技术网

Swift 将图像加载到核心数据中的相册时出现问题

Swift 将图像加载到核心数据中的相册时出现问题,swift,xcode,core-data,nspredicate,Swift,Xcode,Core Data,Nspredicate,我在核心数据中设置了一对多关系 相册可以保存许多图像 每次我创建新相册时,都会加载相同的图像。我希望用户能够将不同的照片保存到每个相册中 我想当我试图加载数据时,问题可能出在谓词上,但我不能完全确定。我很抱歉发布了所有这些可能不相关的代码,但我想发布所有代码,以防有一些我看不到的东西可能被其他人捕获 我还想补充一点,当我为NSPredicate添加代码时,当我单击A album单元格时,集合视图中不会显示图像,但当我在loadData()中注释掉谓词的代码时,图像会显示出来。我不知道这是为什么

我在核心数据中设置了一对多关系

相册可以保存许多图像

每次我创建新相册时,都会加载相同的图像。我希望用户能够将不同的照片保存到每个相册中

我想当我试图加载数据时,问题可能出在谓词上,但我不能完全确定。我很抱歉发布了所有这些可能不相关的代码,但我想发布所有代码,以防有一些我看不到的东西可能被其他人捕获

我还想补充一点,当我为NSPredicate添加代码时,当我单击A album单元格时,集合视图中不会显示图像,但当我在loadData()中注释掉谓词的代码时,图像会显示出来。我不知道这是为什么

      class ViewController: UIViewController  {
var fetchedResultsController: NSFetchedResultsController<PhotoAlbum>!

var contextApp  = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
var moc:NSManagedObjectContext! = nil

@IBOutlet weak var tableView: UITableView!


func setupFetchedResultsController() {


    let fetchRequest:NSFetchRequest<PhotoAlbum> = PhotoAlbum.fetchRequest()

    let sortDescriptor = NSSortDescriptor(key: "album", ascending: true)
    fetchRequest.sortDescriptors = [sortDescriptor]


    fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: contextApp, sectionNameKeyPath: nil, cacheName: nil)

    fetchedResultsController.delegate = self


    do {
        try fetchedResultsController.performFetch()
    }catch {
        print(error)
    }


}

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    tableView.delegate = self
    tableView.dataSource = self


    setupFetchedResultsController()
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)


    setupFetchedResultsController()


}


@IBAction func createNewAlbum(_ sender: UIBarButtonItem) {
    presentnewAlbumAlert()
}




func presentnewAlbumAlert () {
    let alert = UIAlertController(title: "New Album", message: "Enter a name for this album", preferredStyle: .alert)

    // Create actions
    let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
    let saveAction = UIAlertAction(title: "Save", style: .default) { [weak self] action in
        if let name = alert.textFields?.first?.text {
            self?.addAlbumCell(name: name)
        }
    }
    saveAction.isEnabled = false

    // Add a text field
    alert.addTextField { textField in
        textField.placeholder = "Name"
        NotificationCenter.default.addObserver(forName: UITextField.textDidChangeNotification, object: textField, queue: .main) { notif in
            if let text = textField.text, !text.isEmpty {
                saveAction.isEnabled = true
            } else {
                saveAction.isEnabled = false
            }
        }
    }

    alert.addAction(cancelAction)
    alert.addAction(saveAction)
    present(alert, animated: true, completion: nil)
}


func addAlbumCell(name: String) {

    let album = PhotoAlbum(context: contextApp)
    album.album = name

    do {
        try contextApp.save()
    }catch{
        print(error)
    }

}
func deleteNote(at indexPath: IndexPath) {
    let albumToDelete = fetchedResultsController.object(at: indexPath)
    contextApp.delete(albumToDelete)
    try? contextApp.save()
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    if segue.identifier == "toCollection" {
        if let indexPath = tableView.indexPathForSelectedRow {
            let object = fetchedResultsController.object(at: indexPath)

           (segue.destination as! PhotoViewController).album = object


     }  


    }

}
}

//马克:德尔盖特

extension ViewController : UITableViewDelegate {

func numberOfSections(in tableView: UITableView) -> Int {
    return fetchedResultsController?.sections?.count ?? 1
}
}

//加载和保存图像

func loadData() {
    let imageReqeust: NSFetchRequest<Images>  = Images.fetchRequest()

    let predicate = NSPredicate(format: "images.album == %@", album)
    imageReqeust.predicate = predicate

   // print(predicate.description)
    do {
        imageDataArray = try managedObjectContext.fetch(imageReqeust)
        self.collectionView.reloadData()
    }catch {
        print("Could not load data from database \(error.localizedDescription)")
    }
}


func createImageContext( with image: UIImage) {
    let imageItem = Images(context: managedObjectContext!)
    imageItem.images = NSData(data: image.jpegData(compressionQuality: 1.0)!) as Data
    //            imageItem.image = NSData(data: UIImageJPEGRepresentation(image, 0.3)!) as Data



    do {
        try self.managedObjectContext.save()
        self.loadData()
    }catch {
        print("Could not save data \(error.localizedDescription)")
    }




}

// ViewDidLoad

override func viewDidLoad() {
    super.viewDidLoad()


    collectionView.delegate = self
    collectionView.dataSource = self

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

    self.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(addImage(_:)))

    loadData()
    // Do any additional setup after loading the view.
}
func loadData(){
让ImageRequest:NSFetchRequest=Images.fetchRequest()
let predicate=NSPredicate(格式:“images.album==%@”,album)
ImageRequest.predicate=谓词
//打印(谓词描述)
做{
imageDataArray=尝试managedObjectContext.fetch(ImageRequest)
self.collectionView.reloadData()
}抓住{
打印(“无法从数据库\(错误。localizedDescription)”加载数据)
}
}
func createImageContext(带图像:UIImage){
让imageItem=Images(上下文:managedObjectContext!)
imageItem.images=NSData(数据:image.jpegData(压缩质量:1.0)!)作为数据
//imageItem.image=NSData(数据:UIImageJPEG表示法(图像,0.3)!)作为数据
做{
请尝试self.managedObjectContext.save()
self.loadData()
}抓住{
打印(“无法保存数据\(错误。localizedDescription)”)
}
}
//ViewDidLoad
重写func viewDidLoad(){
super.viewDidLoad()
collectionView.delegate=self
collectionView.dataSource=self
managedObjectContext=(UIApplication.shared.delegate为!AppDelegate)。persistentContainer.viewContext
self.navigationItem.rightBarButtonItem=UIBarButtonItem(barButtonSystemItem:。添加,目标:self,操作:#选择器(添加图像(:))
loadData()
//加载视图后执行任何其他设置。
}

在第二个视图控制器中,您不需要从核心数据获取图像,而是可以通过相册属性访问它们

imageDataArray = Array(album.images)
保存新图像实例时,不要忘记将其分配到相册

imageItem.album = self.album

只是一张纸条。更好的方法是将图像存储在磁盘上(例如存储到文档中),并将路径保存到CoreData中。
func loadData() {
    let imageReqeust: NSFetchRequest<Images>  = Images.fetchRequest()

    let predicate = NSPredicate(format: "images.album == %@", album)
    imageReqeust.predicate = predicate

   // print(predicate.description)
    do {
        imageDataArray = try managedObjectContext.fetch(imageReqeust)
        self.collectionView.reloadData()
    }catch {
        print("Could not load data from database \(error.localizedDescription)")
    }
}


func createImageContext( with image: UIImage) {
    let imageItem = Images(context: managedObjectContext!)
    imageItem.images = NSData(data: image.jpegData(compressionQuality: 1.0)!) as Data
    //            imageItem.image = NSData(data: UIImageJPEGRepresentation(image, 0.3)!) as Data



    do {
        try self.managedObjectContext.save()
        self.loadData()
    }catch {
        print("Could not save data \(error.localizedDescription)")
    }




}

// ViewDidLoad

override func viewDidLoad() {
    super.viewDidLoad()


    collectionView.delegate = self
    collectionView.dataSource = self

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

    self.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(addImage(_:)))

    loadData()
    // Do any additional setup after loading the view.
}
imageDataArray = Array(album.images)
imageItem.album = self.album