Таким образом, у меня есть viewcontroller для пользователя, чтобы редактировать свою фотографию профиля и фотографию заголовка. Он у меня там, где пользователь выбирает фотографию, и она сохраняет ее в базе данных Firebase, а затем загружает изображение и отображает его в соответствующих представлениях UIImage. Единственная проблема, с которой я столкнулся, заключается в том, что если я только отредактирую изображение профиля и нажму «Сохранить», это сохранит как изображение профиля, так и фотографию заголовка, даже если я не редактировал фотографию заголовка. Он также сохраняет данные из изображения профиля, выбранного как для изображения профиля, так и для фотографии заголовка, которая стирает исходную фотографию заголовка и отображает выбранное изображение профиля в обоих представлениях UIImage. Я не уверен, почему он это делает, я уверен, что упускаю что-то важное, но я не уверен, что это такое. Вот мой весь viewcontroller для этого.
import UIKit
import Foundation
import Firebase
import FirebaseDatabase
import FirebaseAuth
class NewEditProfileViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate, UIPickerViewDataSource, UIPickerViewDelegate {
@IBOutlet weak var imageView1: UIImageView!
@IBOutlet weak var imageView2: UIImageView!
@IBOutlet weak var usernameDisplay: UITextField!
@IBOutlet weak var artistBandDJ: UILabel!
@IBOutlet weak var editArtistBandDJ: UIButton!
let you = ["Artist", "Band", "DJ", "Musician", "Producer"]
var picker:UIPickerView!
var ref = DatabaseReference.init()
var imagePicker = UIImagePickerController()
var imagePicked = 0
var databaseRef = Database.database().reference()
var selectedImage1: UIImage?
override func viewDidLoad() {
super.viewDidLoad()
self.ref = Database.database().reference()
imagePicker.delegate = self
imagePicker.sourceType = .photoLibrary
imagePicker.allowsEditing = true
guard let uid = Auth.auth().currentUser?.uid else { return }
self.databaseRef.child("users/profile").child(uid).observeSingleEvent(of: .value) { (snapshot:DataSnapshot) in
let dict = snapshot.value as? [String:Any]
self.usernameDisplay.text = dict!["username"] as? String
self.artistBandDJ.text = dict!["What do you consider yourself?"] as? String
if(dict!["photoURL"] != nil) {
let databaseProfilePic = dict!["photoURL"] as! String
if let data = NSData(contentsOf: NSURL(string: databaseProfilePic)! as URL) {
self.setProfilePic(imageView: self.imageView1,imageToSet:UIImage(data: data as Data)!)
}
}
if(dict!["headerURL"] != nil) {
let databaseHeaderPic = dict!["headerURL"] as! String
if let data2 = NSData(contentsOf: NSURL(string:databaseHeaderPic)! as URL) {
self.setHeaderPic(imageView2: self.imageView2, imageToSet2: UIImage(data: data2 as Data)!)
}
}
}
}
@IBAction func chooseImage1(_ sender: Any) {
if UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.photoLibrary){
imagePicked = (sender as AnyObject).tag
present(imagePicker, animated: true)
}
}
@IBAction func chooseImage2(_ sender: Any) {
if UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.photoLibrary){
imagePicked = (sender as AnyObject).tag
present(imagePicker, animated: true)
}
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
let pickedImage = info[UIImagePickerController.InfoKey.editedImage] as? UIImage
let pickedImage2 = info[UIImagePickerController.InfoKey.editedImage] as? UIImage
if imagePicked == 1 {
self.imageView1.image = pickedImage
} else if imagePicked == 2 {
self.imageView2.image = pickedImage2
}
dismiss(animated: true)
}
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
dismiss(animated: true)
}
@IBAction func saveButton(_ sender: Any) {
self.saveFIRData()
self.saveHeaderPhoto()
self.savePicker()
self.saveUpdateName()
self.dismiss(animated: true, completion: nil)
}
@IBAction func backButton(_ sender: Any) {
self.dismiss(animated: true, completion: nil)
}
func saveFIRData() {
guard let image = imageView1.image else { return }
self.uploadProfileImage(image){ url in
if url != nil {
self.saveProfileImage(profileURL: url!){ success in
if success != nil{
print("yes")
}
}
}
}
}
func saveHeaderPhoto() {
guard let image2 = imageView2.image else { return }
self.uploadHeaderImage(image2){ url in
self.saveHeaderImage(profileURL2: url!){ success in
if success != nil {
print("yes")
}
}
}
}
@IBAction func editButton(_ sender: Any) {
self.editButtonTapped()
}
func editButtonTapped() {
let vc = UIViewController()
vc.preferredContentSize = CGSize(width: 150, height: 150)
let picker = UIPickerView(frame: CGRect(x: 0, y: 0, width: 150, height: 150))
picker.delegate = self
picker.dataSource = self
vc.view.addSubview(picker)
let editBandDJAlert = UIAlertController(title: "What do you consider yourself?", message: nil, preferredStyle: UIAlertController.Style.alert)
editBandDJAlert.setValue(vc, forKey: "contentViewController")
editBandDJAlert.addAction(UIAlertAction(title: "Done", style: .default, handler: nil))
editBandDJAlert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
self.present(editBandDJAlert, animated:true)
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return you.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return you[row]
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
artistBandDJ.text = you[row]
}
internal func setProfilePic(imageView:UIImageView,imageToSet:UIImage) {
imageView1.layer.cornerRadius = imageView1.bounds.height / 2
imageView1.layer.masksToBounds = true
imageView1.image = imageToSet
}
internal func setHeaderPic(imageView2:UIImageView,imageToSet2:UIImage) {
imageView2.layer.masksToBounds = true
imageView2.image = imageToSet2
}
func savePicker() {
guard let uid = Auth.auth().currentUser?.uid else { return }
let selectedValue = artistBandDJ.text
let ref = Database.database().reference().root
let userObject = [
"What do you consider yourself?":selectedValue
]
ref.child("users/profile").child(uid).updateChildValues(userObject as [AnyHashable : Any])
}
func saveUpdateName() {
guard let uid = Auth.auth().currentUser?.uid else { return }
let updatedName = usernameDisplay.text
let ref = Database.database().reference().root
let userObject = [
"username":updatedName
]
ref.child("users/profile").child(uid).updateChildValues(userObject as [AnyHashable : Any])
}
}
extension NewEditProfileViewController {
func uploadProfileImage(_ image:UIImage, completion: @escaping (_ url: URL?)->()) {
guard let uid = Auth.auth().currentUser?.uid else { return }
let storageRef = Storage.storage().reference().child("users/\(uid)")
let imageData = imageView1.image?.jpegData(compressionQuality: 0.8)
let metaData = StorageMetadata()
metaData.contentType = "image/jpeg"
storageRef.putData(imageData!, metadata: metaData) { (metaData, error) in
if error == nil{
print("success for profile photo")
storageRef.downloadURL(completion: { (url, error) in
completion(url)
})
}else{
print("error in save image")
completion(nil)
}
}
}
func uploadHeaderImage(_ image2:UIImage, completion: @escaping (_ url2: URL?)->()) {
guard let uid = Auth.auth().currentUser?.uid else { return }
let storageRef = Storage.storage().reference().child("users/\(uid)")
let imageData2 = imageView2.image?.jpegData(compressionQuality: 0.8)
let metaData = StorageMetadata()
metaData.contentType = "image/jpeg"
storageRef.putData(imageData2!, metadata: metaData) { (metaData, error) in
if error == nil{
print("success for header")
storageRef.downloadURL(completion: { (url, error) in
completion(url)
})
}else{
print("error in save image")
completion(nil)
}
}
}
func saveProfileImage(profileURL:URL, completion: @escaping ((_ url: URL?) -> ())){
guard let uid = Auth.auth().currentUser?.uid else { return }
let databaseRef = Database.database().reference().child("users/profile/\(uid)")
let userObject = [
"photoURL": profileURL.absoluteString
] as [String:Any]
self.ref.child("users/profile").child(uid).updateChildValues(userObject)
}
func saveHeaderImage(profileURL2:URL, completion: @escaping ((_ url: URL?) -> ())){
guard let uid = Auth.auth().currentUser?.uid else { return }
let databaseRef = Database.database().reference().child("users/profile/\(uid)")
let userObject = [
"headerURL": profileURL2.absoluteString
] as [String:Any]
self.ref.child("users/profile").child(uid).updateChildValues(userObject)
}
}