Доступ к камере с помощью опции Actionsheet - PullRequest
0 голосов
/ 15 июня 2019

Я пытаюсь предоставить пользователю два варианта загрузки изображения: первый - библиотека фотографий, а второй - камера.У меня есть лист действий, где пользователь может выбрать способ загрузки изображения, но при нажатии на опцию камеры приложение камеры не открывается.Я добавил конфиденциальность, необходимую в файле plist.Это мой код действий:

extension MoreReportsVC: UIImagePickerControllerDelegate, UINavigationControllerDelegate {

func handleAddPhoto() {
    showSimpleActionSheet(controller: self)
}


func showSimpleActionSheet(controller: UIViewController) {
    let alert = UIAlertController(title: "Add a photo", message: "Please Select an option", preferredStyle: .actionSheet)
    alert.addAction(UIAlertAction(title: "From photo library", style: .default, handler: { (_) in
        self.imagePicker.getImage(fromSourceType: .photoLibrary)
    }))

    alert.addAction(UIAlertAction(title: "Open camera app", style: .default, handler: { (_) in
        self.imagePicker.getImage(fromSourceType: .camera)
    }))

    alert.addAction(UIAlertAction(title: "Dismiss", style: .cancel, handler: { (_) in
        print("User click Dismiss button")
    }))

    self.present(alert, animated: true, completion: {
        print("completion block")
    })
}
}

Это мой код ImagePicker:

class ImagePickerManager: UIViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate {

var placeholderImage: UIImageView?
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
    picker.dismiss(animated: true, completion: nil)
}

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

func getImage(fromSourceType sourceType: UIImagePickerController.SourceType){
    if UIImagePickerController.isSourceTypeAvailable(sourceType){
        let imagePickerController = UIImagePickerController()
        imagePickerController.delegate = self
        imagePickerController.sourceType = sourceType
        self.present(imagePickerController, animated: true, completion: nil)
    }
}
}

imagePicker в листе действий - это просто переменная ImagePickerManager.Приложение не аварийно завершает работу или что-то в этом роде, и оно попадает в метод getImage, но просто не открывайте камеру.

РЕДАКТИРОВАТЬ: Я думаю, что проблема в делегате = себя.Я должен быть VC, с которого я пытаюсь просмотреть сборщик изображений, если я не ошибаюсь.и в настоящее время это ImagePickerManager, но я не могу найти способ установить его в качестве моего VC.

Ответы [ 2 ]

0 голосов
/ 15 июня 2019

Проблема в том, что ваш ImagePickerManager на самом деле не является ссылкой на какой-либо контроллер представления в настоящее время в интерфейсе. Таким образом, self.present ничего не делает, потому что self не является текущим контроллером представления.

Если вы хотите поместить управление сборщиком изображений в инкапсулированный класс, который не является текущим контроллером представления, инкапсуляция не должна сама быть контроллером представления; это должен быть просто обычный объект. Тогда вы не сможете сказать self.present, поэтому вам нужно будет предоставить этому объекту ссылку на текущий контроллер представления, который в данном случае является вашим MoreReportsVC.

0 голосов
/ 15 июня 2019

Добавить getImage метод в UIViewController расширение, как это.

extenstion UIViewController { 
    func getImage(fromSourceType sourceType: UIImagePickerController.SourceType){
        if UIImagePickerController.isSourceTypeAvailable(sourceType){
            let imagePickerController = UIImagePickerController()
            imagePickerController.delegate = self
            imagePickerController.sourceType = sourceType
            self.present(imagePickerController, animated: true, completion: nil)
         } else {
            print("Source type isn't available")
         }
    }
}

И вызовите этот метод из showSimpleActionSheet метод из self

func showSimpleActionSheet(controller: UIViewController) {
    let alert = UIAlertController(title: "Add a photo", message: "Please Select an option", preferredStyle: .actionSheet)
    alert.addAction(UIAlertAction(title: "From photo library", style: .default, handler: { (_) in
        self.getImage(fromSourceType: .photoLibrary)
    }))

    alert.addAction(UIAlertAction(title: "Open camera app", style: .default, handler: { (_) in
        self.getImage(fromSourceType: .camera)
    }))

    alert.addAction(UIAlertAction(title: "Dismiss", style: .cancel, handler: { (_) in
        print("User click Dismiss button")
    }))

    self.present(alert, animated: true, completion: {
        print("completion block")
    })
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...