Сохранение изображения профиля и фотографии заголовка в Firebase - PullRequest
0 голосов
/ 11 января 2020

Таким образом, у меня есть 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)
    }
}

1 Ответ

1 голос
/ 11 января 2020

Похоже, что вы переопределяете все, когда пользователи нажимают кнопку сохранения. Это можно решить, добавив свойство var headerChanged = false в контроллер представления. Затем в chooseImage1 вы устанавливаете значение true.

Когда вызывается saveButton, вы проверяете, изменилось ли оно или нет, проверяя флаг (headerChanged).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...