首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将头像和头像保存到Firebase

将头像和头像保存到Firebase
EN

Stack Overflow用户
提问于 2020-01-11 12:54:16
回答 1查看 30关注 0票数 0

所以我有一个视图控制器,让用户编辑他们的头像和头像。我有它的地方,用户选择一张照片,它将保存到firebase数据库,然后将下载图像,并在适当的UIImage视图中显示它。唯一的问题是,如果我只编辑头像和点击保存,它保存头像和头像,即使我没有编辑头像。它还保存为配置文件图片和标题照片选择的配置文件图片中的数据,这将删除原始标题照片并在两个UIImage视图中显示所选的配置文件图像。我不确定它为什么这样做,我确定我错过了一些重要的东西,但我不确定它是什么。这是我的整个视图控制器。

代码语言:javascript
复制
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)
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-11 17:36:12

当用户按下保存按钮时,看起来您正在覆盖所有内容。这可以通过向视图控制器添加一个属性var headerChanged = false来解决。然后在chooseImage1中将其设置为true。

当调用saveButton时,您可以通过检查标志(headerChanged)来检查它是否已更改。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59691759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档