#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)
код из текущей настройки, а затем повторить попытку? Не рекомендуется изменять иерархию представлений выбора системы.