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:
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:
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.
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