我正在尝试创建一个UIBarButtonItem,一旦点击按钮就会打开相机。出于某种原因,我的takePicture(_sender :)函数似乎没有被调用。
我最初尝试使用Interface Builder创建我的UIBarButtonItem。这是连接到UIBarButtonItem的操作的界面和屏幕截图:
这是我的takePicture(_sender :)函数的代码:
@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)
}
我的函数声明旁边的小圆圈已填入并正确连接:
然而,当我加载模拟器并按下按钮时,UIImagePickerController永远不会出现,我的print()函数永远不会在代码中被调用。
因此,我尝试以编程方式声明UIBarButtonItem以查看它是否是Xcode的Interface Builder的问题。这是我的代码:
(注意:我从Interface Builder中删除了UIBarButtonItem,然后使用@IBOutlet将UIToolbar连接到我的代码。)
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)
}
作为调试此程序并试图找到问题所在的最后一次尝试,我在UI中创建了一个临时按钮并将其连接到我的takePicture(_sender :)函数(我将签名从UIBarButtonItem更改为一个UIButton)。这非常有效。这告诉我问题不在于函数本身,而在于与连接有关。
答案 0 :(得分:4)
当我发现类似的问题时,我离这个问题只有几秒钟的距离。用户说他们问题的根源在他们的View Controller上的UITapGestureRecognizer中。
要解决我的问题,我只需将我的UITapGestureRecognizer的目标设置为我的StackView而不是整个视图。
<强>原始强>:
<强>解决:强>
我很想知道为什么UITapGestureRecognizer会阻止我的UIBarButtonItem被点击,而不是正常的UIButton。似乎有点奇怪...
答案 1 :(得分:2)
快捷键4
我遇到了这个问题,并参考了以上答案。我从事的项目将UIButton作为导航栏项,因此它位于导航项下,并且我发现IBAction的出口应连接至栏按钮项中的按钮,而不是将其连接至栏按钮项本身。在mattkx4的问题中,IBAction具有“ UIBarButtonItem”作为其发送者。我通过将条形按钮项内的按钮连接到动作来解决此问题。
如您所见,条形按钮项中有一个按钮。将动作连接到此按钮,动作将被触发。
答案 2 :(得分:0)
确保将相机按钮与touchUpInside事件
的操作相关联