2016-10-16 3 views
0

Ich versuche, einen Controller für alle Bildfunktionen zu erstellen, damit Sie alle Kameraaktionen problemlos von jedem Ansichtscontroller aus binden können.UIImagePickerControllerDeletage wird nicht aufgerufen

Im Idealfall, was mein Ziel, eine Klasse mit einer Funktion, die eine UIImage zurück und lassen Sie meine Selbst individuelle Ausstattungs Handler

dh schreiben zu schaffen.

let imagePicker = ImagePickerAlertController(frame:self.view.frame,controller:self) 
    imagePicker.displayAlert(){ 
    imageValue in if let image = imageValue { 
     myImageView.image = image 
     } 
} 

Allerdings kann ich nicht scheinen, um das Bild zu speichern oder sogar auf das Bild zuzugreifen, das ich von der Kamera genommen habe. Die imagePickerController-Funktion scheint nicht zu treffen.

import UIKit 

class ImagePickerAlertController: UIView, UIImagePickerControllerDelegate,UINavigationControllerDelegate { 

    var UIViewController : UIViewController? 

    let imagePicker: UIImagePickerController! = UIImagePickerController() 

    init(frame: CGRect, controller: UIViewController){ 

    self.UIViewController = controller 
    super.init(frame:frame) 

    } 

    required init?(coder aDecoder: NSCoder) { 

    self.UIViewController = nil 
    super.init(coder: aDecoder) 
    } 

    public func displayAlert(){ 
    let alert = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet) 

    let galleryAction = UIAlertAction(title: "Choose Photo",style:.default) {action -> Void in print("ok")} 
    let cameraAction = UIAlertAction(title: "Take Photo",style:.default) {action -> Void in self.takePicture() } 
    let cancelAction = UIAlertAction(title: "Cancel",style:.cancel) {action -> Void in } 

    alert.addAction(cancelAction) 
    alert.addAction(cameraAction) 
    alert.addAction(galleryAction) 

    self.UIViewController?.present(alert,animated:true,completion:nil) 

    } 

    private func takePicture() { 

    if (UIImagePickerController.isSourceTypeAvailable(.camera)){ 
     if UIImagePickerController.availableCaptureModes(for: .rear) != nil || UIImagePickerController.availableCaptureModes(for: .front) != nil{ 
     imagePicker.allowsEditing = false 
     imagePicker.sourceType = .camera 
     imagePicker.cameraCaptureMode = .photo 
     imagePicker.delegate = self 
     self.UIViewController?.present(imagePicker,animated: true,completion: nil) 
     } 
     else { 
     postAlert(title: "Rear camera doesn't exist",message:"Application cannot access the camera.") 
     } 

    } 
    else { 
     postAlert(title: "Camera inaccessable",message:"Application cannot access the camera.") 
    } 
    } 

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 
    print("got image") 
    if let pickedImage:UIImage = (info[UIImagePickerControllerOriginalImage]) as? UIImage { 
     let selectorToCall = Selector(("imageWasSavedSuccessfully:didFinishSavingWithError:context:")) 
     UIImageWriteToSavedPhotosAlbum(pickedImage, self, selectorToCall, nil) 
    } 
    imagePicker.dismiss(animated: true,completion: nil) 
    } 

    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { 
    print("cancel") 
    self.UIViewController?.dismiss(animated: true, completion: nil) 
    } 

    func imageWasSavedSuccessfully(image: UIImage, didFinishSavingWithError error : NSError!, context: UnsafeMutablePointer<()>){ 
    print("image saved") 
    if (error) != nil { 
     print(error) 
    } 
    else { 
     print("good to go") 
    } 
    } 


    func postAlert(title: String, message: String) { 
    let alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.alert) 
    alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.default, handler: nil)) 
    self.UIViewController?.present(alert, animated: true, completion: nil) 
    } 

} 

Antwort

2

Das Problem ist, dass Sie versuchen, imagePicker zu präsentieren, wenn Ihre UIViewController bereits einen modalen View-Controller oben dargestellt hat.

displayAlert (?):

self.UIViewController .present (Alarm, animiert: true, Fertigstellung: nil)

Takepicture():

self.UIViewController ? .present (imagePicker, animiert: true, Vervollständigung: null)

So sollten Sie UIAlertController entlassen, sobald Sie es nicht brauchen:

let cameraAction = UIAlertAction(title: "Take Photo",style:.default) {action -> Void in 
    alert.dismiss(animated: true, completion: nil) 
    self.takePicture()   
} 

Jetzt Viewcontroller kann present ohne Probleme

+0

erstaunlich. Nur eine Follow-up-Frage. Dies bedeutet, dass es immer nur einen Controller geben kann? –

+0

Ja. Dort kann für einen bestimmten Controller nur ein VC modal im Moment präsentiert werden. Um eine neue anzuzeigen, müssen Sie die aktuelle ablehnen. Sie können jedoch einen anderen VC als den, den Sie bereits vorgestellt haben, präsentieren, aber es ist nicht die beste Vorgehensweise. – alexburtnik