Курс 26: Приложения На Основе UITableView (не подгружается изображение из библиотеки)


#1

Добрый день, прохожу Курс 26: Приложения На Основе UITableView, не могу разобраться почему при создании новой записи в списке мест изображение погружается только то, которое предусмотрено по умолчанию, а то которое выбираю из библиотеки нет… При этом, если потом захожу и редактирую запись, то все в порядке и изображение подгружается из библиотеки…
третий день не могу починить…


#2

Покажите как выглядит код загрузки изображения
p.s. хранить изображения в бд не лучшая практика


#3

бд?

загружаются изображения пользователем

//
// NewPlaceViewController.swift
// My places
//
// Created by Buba on 16.01.2022.
//

import UIKit

class NewPlaceViewController: UITableViewController {

var currentPlace: Place?

var imageIsChanged = false

@IBOutlet weak var saveButton: UIBarButtonItem!

@IBOutlet weak var placeImage: UIImageView!
@IBOutlet weak var placeName: UITextField!
@IBOutlet weak var placeLocation: UITextField!
@IBOutlet weak var placeType: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()
    
    tableView.tableFooterView = UIView()
    saveButton.isEnabled = false
    placeName.addTarget(self, action: #selector(textFieldChanged), for: .editingChanged)
    setupEditScreen()
}

//MARK: Table view delegate

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    
    if indexPath.row == 0 {
        
        let cameraIcon = UIImage(named: "camera")
        let photoIcon = UIImage (named: "photo")
        
        let actionSheet = UIAlertController(title: nil,
                                            message: nil,
                                            preferredStyle: .actionSheet)
        
        let camera = UIAlertAction(title: "Camera", style: .default) { _ in
            self.chooseImagePicker(source: .camera)
        }
        
        camera.setValue(cameraIcon, forKey: "image")
        camera.setValue(CATextLayerAlignmentMode.left, forKey: "titleTextAlignment")
        
        let photo = UIAlertAction(title: "Photo", style: .default) { _ in
            self.chooseImagePicker(source: .photoLibrary)
        }
        
        photo.setValue(photoIcon, forKey: "image")
        photo.setValue(CATextLayerAlignmentMode.left, forKey: "titleTextAlignment")
        
        let cancel = UIAlertAction(title: "Cancel", style: .cancel)
        
        actionSheet.addAction(camera)
        actionSheet.addAction(photo)
        actionSheet.addAction(cancel)
        
        present(actionSheet, animated: true)
    } else {
        
        view.endEditing(true)
    }
}

func savePlace() {
    
    var image: UIImage?
    
    if imageIsChanged {
        image = placeImage.image
    } else {
        image = UIImage(named: "imagePlaceholder")
    }
    
    let imageData = image?.pngData()
    
    let newPlace = Place(name: placeName.text!, location: placeLocation.text, type: placeType.text, imageData: imageData)
    
    if currentPlace != nil {
        try! realm.write {
            currentPlace?.name = newPlace.name
        currentPlace?.location = newPlace.location
        currentPlace?.type = newPlace.type
        currentPlace?.imageData = newPlace.imageData
        }
        } else {
        StorogeManager.saveObject(newPlace)
    }
}

private func setupEditScreen () {

    if currentPlace != nil {
        setupNavigationBar()
        imageIsChanged = true
        guard let data = currentPlace?.imageData, let image = UIImage(data: data) else { return }

        placeImage.image = image
        placeImage.contentMode = .scaleAspectFill
        placeName.text = currentPlace?.name
        placeLocation.text = currentPlace?.location
        placeType.text = currentPlace?.type
    }
}

private func setupNavigationBar() {
    if let topItem = navigationController?.navigationBar.topItem {
        topItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    }
    navigationItem.leftBarButtonItem = nil
    title = currentPlace?.name
    saveButton.isEnabled = true
}

@IBAction func cancelAction(_ sender: Any) {
    
    dismiss(animated: true)
}

}

//MARK: Text field delegate

extension NewPlaceViewController: UITextFieldDelegate {

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    
    textField.resignFirstResponder()
    
    return true
}

@objc private func textFieldChanged() {
    
    if placeName.text?.isEmpty == false{
        saveButton.isEnabled = true
    } else {
        saveButton.isEnabled = false
    }
}

}

//MARK: Work with image
extension NewPlaceViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {

func chooseImagePicker(source: UIImagePickerController.SourceType) {
    
    if UIImagePickerController.isSourceTypeAvailable(source) {
        let imagePicker = UIImagePickerController()
        imagePicker.delegate = self
        imagePicker.allowsEditing = true
        imagePicker.sourceType = source
        present(imagePicker, animated: true)
    }
}

func imagePickerController(_ picker: UIImagePickerController,
                           didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    
    placeImage.image = info[.editedImage] as? UIImage
    placeImage.contentMode = .scaleAspectFill
    placeImage.clipsToBounds = true
    dismiss(animated: true)
}

}