Por que a biblioteca de fotos não é exibida quando eu a seleciono no swift?

Dec 09 2020

Com esta pergunta, peço ao usuário para decidir se deseja usar a câmera ou escolher uma imagem de seu telefone:

//Show alert to select the media source type.
    private func showAlert() {

        let alert = UIAlertController(title: "Image Selection", message: "From where you want to pick this image?", preferredStyle: .actionSheet)
        alert.addAction(UIAlertAction(title: "Camera", style: .default, handler: {(action: UIAlertAction) in
            self.imagePicker.sourceType = .camera
        }))
        alert.addAction(UIAlertAction(title: "Photo Album", style: .default, handler: {(action: UIAlertAction) in
            self.imagePicker.sourceType = .photoLibrary
        }))
        alert.addAction(UIAlertAction(title: "Cancel", style: .destructive, handler: nil))
            self.present(alert, animated: true, completion: nil)
    }

Que eu invoco viewDidLoadcomo tal:

override func viewDidLoad() {
        super.viewDidLoad()
        firstTextField.delegate = self
        showAlert()
        present(imagePicker, animated: true, completion: nil)
        imagePicker.delegate = self
        firstImageView.layer.cornerRadius = 8
        
    }

No entanto, quando eu testo isso, o alerta aparece e eu escolho a biblioteca de fotos, mas a biblioteca não aparece. Eu tentei usar, viewDidAppearmas não funcionou bem. Nenhum erro aparece, ele apenas oculta o alerta e mostra o controlador de visualização atual.

Respostas

1 matt Dec 09 2020 at 00:00

Você pode estar imaginando que o código para quando um alerta aparece. Mas isso não acontece! E você não pode mostrar dois controladores de visualização apresentados simultaneamente. Mas é isso que você está tentando fazer.

Você está dizendo showAlert(), então agora seu alerta está ativo, e então você está dizendo imediatamente present(imagePicker), o que você não pode fazer porque seu alerta ainda está ativo.

Use os manipuladores de ação do showAlertalerta para apresentar o seletor de imagens. Dessa forma, o alerta fecha e o seletor de imagens é aberto.