2017-07-01 2 views
2

J'essaie de créer un UIBarButtonItem qui ouvre la caméra une fois que le bouton a été appuyé. Pour une raison quelconque, ma fonction takePicture (_sender :) ne semble pas être appelée.UIBarButtonItem ne déclenche pas IBAction

J'ai essayé à l'origine de créer mon UIBarButtonItem en utilisant l'Interface Builder. Ici était l'interface et une capture d'écran des actions liées à l'UIBarButtonItem: Image of the DetailViewController that contains my UIBarButtonItem

Image of the action outlets for my UIBarButtonItem

Et voici le code pour mon takePicture (_sender :) Fonction:

@IBAction func takePicture(_ sender: UIBarButtonItem) { 

    print("Taking picture...") 

    let imagePicker = UIImagePickerController() 

    // If the device has a camera, take a picture; otherwise, 
    // just pick from photo library 
    if UIImagePickerController.isSourceTypeAvailable(.camera) { 
     imagePicker.sourceType = .camera 
    } else { 
     imagePicker.sourceType = .photoLibrary 
    } 

    imagePicker.delegate = self 

    // Place image picker on the screen 
    present(imagePicker, animated: true, completion: nil) 
} 

Le petit cercle à côté de ma déclaration de fonction est rempli et connecté correctement:

Image of the connection to my @IBOutlet in the code.

Cependant, lorsque je charge le simulateur et que j'appuie sur le bouton, le UIImagePickerController n'apparaît jamais et ma fonction print() n'est jamais appelée dans le code. Par conséquent, j'ai ensuite essayé de déclarer l'UIBarButtonItem par programme pour voir si c'était peut-être un problème sous le capot de l'Interface Builder de Xcode. Il y avait là mon code:

(Note:. J'ai supprimé le UIBarButtonItem de l'Interface Builder, puis je me suis connecté le UIToolbar à mon code à l'aide d'un @IBOutlet)

override func viewDidLoad() { 
    super.viewDidLoad() 

    let takePictureBarButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.camera, target: self, action: #selector(DetailViewController.takePicture)) 

    toolBar.setItems([takePictureBarButton], animated: false) 
} 

@objc func takePicture() { 

    print("Taking picture...") 

    let imagePicker = UIImagePickerController() 

    // If the device has a camera, take a picture; otherwise, 
    // just pick from photo library 
    if UIImagePickerController.isSourceTypeAvailable(.camera) { 
     imagePicker.sourceType = .camera 
    } else { 
     imagePicker.sourceType = .photoLibrary 
    } 

    imagePicker.delegate = self 

    // Place image picker on the screen 
    present(imagePicker, animated: true, completion: nil) 
} 

En tant que dernière tentative au débogage ce En essayant de trouver le problème, j'ai créé un bouton temporaire dans mon interface utilisateur et l'ai connecté à la fonction takePicture (_sender :) à la place (j'ai changé la signature d'un UIBarButtonItem en un UIButton). Cela a fonctionné parfaitement. Cela me dit que le problème n'est pas avec la fonction elle-même, mais a quelque chose à voir avec la connexion.

Répondre

4

J'étais à quelques secondes de poster cette question quand j'ai trouvé une question similaire. L'utilisateur a déclaré que la racine de son problème réside dans un UITapGestureRecognizer sur son View Controller.

Pour résoudre mon problème, j'ai simplement défini la cible de mon UITapGestureRecognizer comme étant mon StackView au lieu de l'ensemble de la vue.

originale:

Image of my UITapGestureRecognizer's outlet collections.

Résolu:

Image of my UITapGestureRecognizer's outlet collections after the fix.

Je serais curieux de savoir pourquoi le UITapGestureRecognizer arrêté mon UIBarButtonItem d'être exploité, mais pas le UIButton normal. Semble un peu étrange ...

0

assurez-vous de connecter votre bouton de la caméra avec l'action pour l'événement touchUpInside

+0

Si je tente de se connecter à l'action d'un UIButton, ce serait un morceau précieux conseils. Toutefois, un objet UIBarButtonItem n'a pas d'événement touchUpInside. UIBarButtonItem est une sous-classe de UIBarItem qui est une sous-classe de NSObject.Alors qu'un UIButton est une sous-classe de UIControl qui contient toutes les actions touchUpInside(). voudrez peut-être vérifier la documentation plus attentivement: - https://developer.apple.com/documentation/uikit/uicontrolevents - https://developer.apple.com/documentation/uikit/uibaritem - https: //developer.apple.com/documentation/uikit/uibarbuttonitem – Mattkx4