Добрый день, прохожу Курс 26: Приложения На Основе UITableView, не могу разобраться почему при создании новой записи в списке мест изображение погружается только то, которое предусмотрено по умолчанию, а то которое выбираю из библиотеки нет… При этом, если потом захожу и редактирую запись, то все в порядке и изображение подгружается из библиотеки…
третий день не могу починить…
Курс 26: Приложения На Основе UITableView (не подгружается изображение из библиотеки)
Buba
#1
Jack
#2
Покажите как выглядит код загрузки изображения
p.s. хранить изображения в бд не лучшая практика
Buba
#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)
}
}