Swift UIImagePickerController не чувствителен при нажатии кнопки выбора иногда

#ios #swift #uiimagepickercontroller

Вопрос:

Когда я представляю modalViewController, и выбор всплывает справа, но я не могу выбрать картинку! Когда я касаюсь списка изображений, список может прокручиваться только вверх и вниз, но не может выбрать!

И вот мой код ViewController

 //
//  SignUpViewController.swift
//  Firebase
//
//  Created by Guri on 02/07/21.
//

import UIKit
import SwiftValidator
import FirebaseAuth
import FirebaseCore
import FirebaseFirestore
import FirebaseFirestoreSwift
import FirebaseStorage


class SignUpViewController: BaseViewController {

    var viewModel = SignUpViewModel()
    private let storage = Storage.storage().reference()
    
    @IBOutlet weak var emailTextField: UITextField!
    @IBOutlet weak var passwordTextField: UITextField!
    @IBOutlet weak var userName: UITextField!
    
    
    override func viewDidLoad() {
        super.viewDidLoad()

        validator.registerField(emailTextField, rules: [RequiredRule(),EmailRule()])
        validator.registerField(passwordTextField, rules: [RequiredRule()])
        validator.registerField(userName, rules: [RequiredRule()])
        
        let settings = FirestoreSettings()

                Firestore.firestore().settings = settings
                // [END setup]
                db = Firestore.firestore()
        
        
    }
    
    
    @IBAction func uploadImageAction(_ sender: UIButton) {
        let picker = UIImagePickerController()
        picker.sourceType = .photoLibrary
        picker.delegate = self
        picker.allowsEditing = true
        picker.modalPresentationStyle = .fullScreen
        present(picker, animated: true)
    }
    
    @IBAction func signUpAction(_ sender: UIButton) {
        self.view.endEditing(true)
        validator.validate(self)
    }
    
    @IBAction func loginAction(_ sender: UIButton) {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let secondViewController = storyboard.instantiateViewController(withIdentifier: "LoginViewController") as! LoginViewController
        self.present(secondViewController, animated: true, completion: nil)
    }
    
}



// ValidationDelegate Methods
extension SignUpViewController : ValidationDelegate {

    func validationSuccessful() {
        FirebaseAuth.Auth.auth().createUser(withEmail: emailTextField.text!, password: passwordTextField.text!) { [self] (authResult, error) in
            if let error = error {
                    self.showToast(error.localizedDescription)
                    return
                } else {
                    guard let user = authResult?.user else {
                        self.showToast("Failed to get access token ")
                        return
                    }
                    self.viewModel.setValues(emailTextField.text!, self.passwordTextField.text!, userName.text!)
                    self.showToast("Registered Successfully")
                    self.userSignUp()
                }
        }
        
    }

    func validationFailed(_ errors:[(Validatable ,ValidationError)]) {
        if let errorMessage = errors.first?.1.errorMessage {
            super.alert(view: self, title: errorMessage, handler: nil)
        }
    }
}



extension SignUpViewController {
    
    func userSignUp() {
        
        // Add a new document with a generated ID
        var ref: DocumentReference? = nil
        ref = db.collection("users").addDocument(data: [
            "email": emailTextField.text!,
            "user name": userName.text!
        ]) { err in
            if let err = err {
                print("Error adding document: (err)")
            } else {
                print("Document added with ID: (ref!.documentID)")
            }
        }
        
        self.getUsers()
        
        let storyboard = UIStoryboard.init(name: "TabBarStoryboard", bundle: nil)
        let initialVC = storyboard.instantiateInitialViewController()
        UIApplication.shared.windows.first?.rootViewController = initialVC
        UIApplication.shared.windows.first?.makeKeyAndVisible()
        
    }
    
    
}


extension SignUpViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]){
        
        
        picker.dismiss(animated: true)
        guard let image = info[UIImagePickerController.InfoKey.editedImage] as? UIImage else {
            return
        }
        
        guard let imageData = image.pngData() else {
            return
        }
        
        
        storage.child("images/file.png").putData(imageData, metadata: nil) { _, error in
            guard error == nil else {
                print("Failed to upload")
                return
            }
            self.storage.child("images/file.png").downloadURL { url, error in
                guard let url = url, error == nil else{
                    return
                }
                let urlString = url.absoluteString
                print("Download URL :- (urlString)")
                
            }
        }
        
    }
    

    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        picker.dismiss(animated: true, completion: nil)
        
        func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) {
            // Solve the problem that the cancel button is not sensitive when selecting photos after iOS 11
            if (UIDevice.current.systemVersion as NSString).floatValue < 11.0 {
                return
            }
            if (viewController.isKind(of: NSClassFromString("UIImagePickerController")!)){
                for (index,obj) in viewController.view.subviews.enumerated() {
                    if obj.frame.size.width < 42 {
                        viewController.view.sendSubviewToBack(obj)
                    }
                }
            }
        }
    }
    
}


 

Я понятия не имею, почему это может происходить.
Вот экран, на котором меня останавливают

Ссылка на Изображение

Комментарии:

1. Почему вы отключаете средство выбора изображений сразу после того, как пользователь выбирает изображение?

2. @ElTomato Я наконец-то переместил этот код в функцию, но он все еще не работает

Ответ №1:

Пожалуйста, ознакомьтесь с комментариями в следующей реализации.

 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) {

    // Do not dismiss this immediately, defer the dismissal
    // Dismiss this when execution returns from current function scope
    // This can be one of the following two 
    // a) early return from one of the `guard else` blocks OR 
    // b) after completing successfully in the end
    defer { picker.dismiss(animated: true) }
    
    guard let image = info[.editedImage] as? UIImage else {
        // Check if this is being printed
        print("Could not find edited image")
        return
    }
        
    guard let imageData = image.pngData() else {
        // Check if this is being printed
        print("Could not create pngData for image")
        return
    }
        
    // Rest of the implementation remains unchanged
}
 

Комментарии:

1. Я проверил код, поставив точку останова, и этот делегат не вызывает

2. @GursharanSachDeva Похоже, у вас могут возникнуть проблемы с иерархией представлений. Можете ли вы попробовать удалить viewController.view.sendSubviewToBack(obj) код из текущей настройки, а затем повторить попытку? Не рекомендуется изменять иерархию представлений выбора системы.