所以我有一个视图控制器,让用户编辑他们的头像和头像。我有它的地方,用户选择一张照片,它将保存到firebase数据库,然后将下载图像,并在适当的UIImage视图中显示它。唯一的问题是,如果我只编辑头像和点击保存,它保存头像和头像,即使我没有编辑头像。它还保存为配置文件图片和标题照片选择的配置文件图片中的数据,这将删除原始标题照片并在两个UIImage视图中显示所选的配置文件图像。我不确定它为什么这样做,我确定我错过了一些重要的东西,但我不确定它是什么。这是我的整个视图控制器。
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)
}
}发布于 2020-01-11 17:36:12
当用户按下保存按钮时,看起来您正在覆盖所有内容。这可以通过向视图控制器添加一个属性var headerChanged = false来解决。然后在chooseImage1中将其设置为true。
当调用saveButton时,您可以通过检查标志(headerChanged)来检查它是否已更改。
https://stackoverflow.com/questions/59691759
复制相似问题