Как выбрать, отобразить два изображения на двух UIImageViews, а затем загрузить эти два выбранных изображения в базу данных и хранилище Firebase? - PullRequest
0 голосов
/ 25 февраля 2020

Я хочу выбрать два разных изображения на двух imageView на одном ViewController, отобразить их, и после нажатия кнопки сохранить выбранные изображения в базе данных Firebase и в хранилище для конкретного пользователя. Мой код может загружать только одно выбранное изображение, а не два разных, я понимаю, что проблема с UIImagePickerController часть, но как я могу решить ее. Полный код viewController ниже. Пожалуйста, помогите !!

override func viewDidLoad() {
        super.viewDidLoad()

        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(SettingProfileViewController.handleSelectProfileImageView(sender:)))
        profilePhoto.addGestureRecognizer(tapGesture)
        profilePhoto.isUserInteractionEnabled = true

        let wallTapGesture = UITapGestureRecognizer(target: self, action: #selector(SettingProfileViewController.handleSelectWallpaperImageView(sender:)))
        wallpaperPhoto.addGestureRecognizer(wallTapGesture)
        wallpaperPhoto.isUserInteractionEnabled = true

        profilePhoto.layer.cornerRadius = 60
        profilePhoto.clipsToBounds = true

    }

    weak var activeImageView:UIImageView? = nil


    @objc func handleSelectWallpaperImageView(sender: UIGestureRecognizer){
        guard let sendingImageView = sender.view as? UIImageView else {
            print("Ooops, received this gesture not from an ImageView")
            return
        }
        activeImageView = sendingImageView
        let actionSheet = UIAlertController(title: "New Photo", message: nil, preferredStyle: .actionSheet)
        actionSheet.addAction(UIAlertAction(title: "Камера", style: .default, handler: { action in
            self.showCamera()
        }))

        actionSheet.addAction(UIAlertAction(title: "Альбом ", style: .default, handler: {action in
            self.showAlbum()
        }))

        actionSheet.addAction(UIAlertAction(title: "Отмена", style: .cancel, handler: nil))
        self.present(actionSheet, animated: true, completion: nil)
    }


    @objc func handleSelectProfileImageView(sender: UIGestureRecognizer){
        guard let sendingImageView = sender.view as? UIImageView else {
            print("Ooops, received this gesture not from an ImageView")
            return
        }
        activeImageView = sendingImageView

        let actionSheet = UIAlertController(title: "New Photo", message: nil, preferredStyle: .actionSheet)
        actionSheet.addAction(UIAlertAction(title: "Камера", style: .default, handler: { action in
            self.showCamera()

        }))

        actionSheet.addAction(UIAlertAction(title: "Альбом ", style: .default, handler: {action in
            self.showAlbum()

        }))

        actionSheet.addAction(UIAlertAction(title: "Отмена", style: .cancel, handler: nil))
        self.present(actionSheet, animated: true, completion: nil)
    }


    func showCamera() {

        let cameraPicker = UIImagePickerController()
        cameraPicker.delegate = self
        cameraPicker.sourceType = .camera

        present(cameraPicker, animated: true, completion: nil)
    }

    func showAlbum(){
           let cameraPicker = UIImagePickerController()
        cameraPicker.delegate = self 
           cameraPicker.sourceType = .photoLibrary

           present(cameraPicker, animated: true, completion: nil)
       }




    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        dismiss(animated: true, completion: nil)
        if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage{
//             selectedImage = image
            activeImageView?.image = image
//            currentImage = image
        }
    }



    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
         dismiss(animated: true, completion: nil)
    }


    ///для того чтобы загруженные фото, отображались на ProfileViewController
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "profileVC" {
            let destination = segue.destination as! ProfileViewController
            destination.wImage = activeImageView?.image


        }
    }




    @IBAction func saveTapped(_ sender: Any) {

        let db = Firestore.firestore()
        let did = Auth.auth().currentUser!.uid

        let storageRef = Storage.storage().reference(forURL: "gs://crut-6c67c.appspot.com").child("profile_Image").child(did)
        if let pImage = self.activeImageView?.image, let imageData = pImage.jpegData(compressionQuality: 0.1) {
            storageRef.putData(imageData, metadata: nil, completion: {(metadata, Error) in
                if Error != nil, metadata != nil {
                    return
                }

                storageRef.downloadURL { (url: URL?,error: Error?) in
                    if let profileImageUrl = url?.absoluteString{
                        db.collection("suppliers").document("ip").collection("ipinfo").document(did).setData(["Profile Image":profileImageUrl], merge: true)
                    }
                }
            })
        }


        let storyBoard: UIStoryboard = UIStoryboard(name: "Profile", bundle: nil)
        let profileViewController = storyBoard.instantiateViewController(identifier:profile.Storyboard.profileViewController) as? ProfileViewController
        self.view.window?.rootViewController = profileViewController
        self.view.window?.makeKeyAndVisible()
    }

}

Ответы [ 3 ]

0 голосов
/ 25 февраля 2020

Вы можете создать переменную экземпляра в вашем viewController, например:

private var isProfilePhotoSelecting = true

Когда пользователь нажимает на profileImageView в методе handleSelectProfileImageView, для isProfilePhotoSelecting устанавливается значение true, т.е. установите для isProfilePhotoSelect значение false, т. е.

@objc func handleSelectWallpaperImageView(sender: UIGestureRecognizer){
        guard let sendingImageView = sender.view as? UIImageView else {
            print("Ooops, received this gesture not from an ImageView")
            return
        }
        // Updated the image under consideration
        isProfilePhotoSelecting = false

        let actionSheet = UIAlertController(title: "New Photo", message: nil, preferredStyle: .actionSheet)
        actionSheet.addAction(UIAlertAction(title: "Камера", style: .default, handler: { action in
            self.showCamera()
        }))

        actionSheet.addAction(UIAlertAction(title: "Альбом ", style: .default, handler: {action in
            self.showAlbum()
        }))

        actionSheet.addAction(UIAlertAction(title: "Отмена", style: .cancel, handler: nil))
        self.present(actionSheet, animated: true, completion: nil)
    }

Затем обновите свой imagePickerDelegate на:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
            if isProfilePhotoSelecting {
                profilePhoto.image = image
            } else {
                wallpaperPhoto.image = image
            }
        }
        dismiss(animated: true, completion: nil)
    }

Это поможет вам установить оба изображения в соответствии с их соответствующим imageView. Затем в методе saveTapped (_ :) вы можете проверить оба изображения для изображений и загрузить их, т. Е. Метод saveTapped () должен выглядеть следующим образом

@IBAction func saveTapped(_ sender: Any) {

    let db = Firestore.firestore()
    let did = Auth.auth().currentUser!.uid

    let storageRef = Storage.storage().reference(forURL: "gs://crut-6c67c.appspot.com")
    if let profileImage = self.profilePhoto.image, let imageData = profileImage.jpegData(compressionQuality: 0.1) {
        let profileStorage = storageRef.child("profile_Image").child(did)
        profileStorage.putData(imageData, metadata: nil, completion: {(metadata, Error) in
            if Error != nil, metadata != nil {
                return
            }

            profileStorage.downloadURL { (url: URL?,error: Error?) in
                if let profileImageUrl = url?.absoluteString {
                    db.collection("suppliers").document("ip").collection("ipinfo").document(did).setData(["Profile Image":profileImageUrl], merge: true)
                }
            }
        })
    }



    if let wallpaperImage = self.wallpaperPhoto.image, let imageData = wallpaperImage.jpegData(compressionQuality: 0.1) {
        let wallpaperStorage = storageRef.child("wallpaper_Image").child(did)
        wallpaperStorage.putData(imageData, metadata: nil, completion: {(metadata, Error) in
            if Error != nil, metadata != nil {
                return
            }

            wallpaperStorage.downloadURL { (url: URL?,error: Error?) in
                if let wallpaperImageUrl = url?.absoluteString {

                    // Do your stuff with wallpaper image url here

                }
            }
        })
    }


    let storyBoard: UIStoryboard = UIStoryboard(name: "Profile", bundle: nil)
    let profileViewController = storyBoard.instantiateViewController(identifier:profile.Storyboard.profileViewController) as? ProfileViewController
    self.view.window?.rootViewController = profileViewController
    self.view.window?.makeKeyAndVisible()
}

Примечание : это не будет ждать Изображения для загрузки, так как вы ожидаете их загрузки. Но это зависит от вашего варианта использования: если вы хотите дождаться завершения загрузки изображения и затем перейти к ProfileViewController, вы можете использовать DispatchGroup для этой цели.

0 голосов
/ 26 февраля 2020

Созданная опция Булева переменная

var isProfilePhotoSelecting:Bool?

@objc func handleSelectWallpaperImageView(sender: UIGestureRecognizer){
isProfilePhotoSelecting = false
/// 
other code
}
@objc func handleSelectProfileImageView(sender: UIGestureRecognizer){
isProfilePhotoSelecting = true
/// 
other code
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        dismiss(animated: true, completion: nil)
        if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage{

            if isProfilePhotoSelecting == true {
                profilePhoto.image = image
            }else {
                wallpaperPhoto.image = image
            }

        }
    }

В saveTapped необходимо добавить ссылки на хранилище для каждого выбранного изображения и его соответствующей базы данных.

@IBAction func saveTapped(_ sender: Any) {

        let db = Firestore.firestore()
        let did = Auth.auth().currentUser!.uid

        let storageRef = Storage.storage().reference(forURL: "gs://crut-6c67c.appspot.com").child("profile_Image").child(did)
        if let profileImage = self.profilePhoto.image, let imageData = profileImage.jpegData(compressionQuality: 0.1){
            storageRef.putData(imageData, metadata: nil, completion: {(metadata, Error) in
                if Error != nil, metadata != nil {
                    return
                }
                storageRef.downloadURL { (url: URL?, error: Error?) in
                    if let profileImageUrl = url?.absoluteString {
                        db.collection("suppliers").document("ip").collection("ipinfo").document(did).setData(["Profile Image":profileImageUrl], merge: true)
                    }
                }
            })
        }

        let wallStoreRef = Storage.storage().reference(forURL: "gs://crut-6c67c.appspot.com").child("Wallpaper_Image").child(did)
        if let wallpaperImage = self.wallpaperPhoto.image, let imageData = wallpaperImage.jpegData(compressionQuality: 0.1) {
            wallStoreRef.putData(imageData, metadata: nil, completion: {(metadata, Error) in
                if Error != nil, metadata != nil {
                    return
                }

                wallStoreRef.downloadURL { (url: URL?,error: Error?) in
                    if let wallpaperImageUrl = url?.absoluteString {
                        // Do your stuff with wallpaper image url here
                    db.collection("suppliers").document("ip").collection("ipinfo").document(did).setData(["Wallpaper Image":wallpaperImageUrl], merge: true)



                    }
                }
            })
        }
0 голосов
/ 25 февраля 2020

Я надеюсь, что вы сохранили последнее выбранное изображение на activeImageView и передали его в Firebase, следовательно, загружается только одно изображение.

Вместо этого создайте и Array и оба изображения, выбранные из handleSelectWallpaperImageView и handleSelectWallpaperImageView, затем l oop через Array и отправьте на Firebase.

Проверьте это для получения дополнительной информации: { ссылка }

...