UIBarButtonItem不会触发IBAction

时间:2017-07-01 22:26:33

标签: swift uibarbuttonitem ibaction

我正在尝试创建一个UIBarButtonItem,一旦点击按钮就会打开相机。出于某种原因,我的takePicture(_sender :)函数似乎没有被调用。

我最初尝试使用Interface Builder创建我的UIBarButtonItem。这是连接到UIBarButtonItem的操作的界面和屏幕截图: Image of the DetailViewController that contains my UIBarButtonItem

Image of the action outlets for my 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)
}

我的函数声明旁边的小圆圈已填入并正确连接:

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

然而,当我加载模拟器并按下按钮时,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)。这非常有效。这告诉我问题不在于函数本身,而在于与连接有关。

3 个答案:

答案 0 :(得分:4)

当我发现类似的问题时,我离这个问题只有几秒钟的距离。用户说他们问题的根源在他们的View Controller上的UITapGestureRecognizer中。

要解决我的问题,我只需将我的UITapGestureRecognizer的目标设置为我的StackView而不是整个视图。

<强>原始

Image of my UITapGestureRecognizer's outlet collections.

<强>解决:

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

我很想知道为什么UITapGestureRecognizer会阻止我的UIBarButtonItem被点击,而不是正常的UIButton。似乎有点奇怪...

答案 1 :(得分:2)

  

快捷键4

我遇到了这个问题,并参考了以上答案。我从事的项目将UIButton作为导航栏项,因此它位于导航项下,并且我发现IBAction的出口应连接至栏按钮项中的按钮,而不是将其连接至栏按钮项本身。在mattkx4的问题中,IBAction具有“ UIBarButtonItem”作为其发送者。我通过将条形按钮项内的按钮连接到动作来解决此问题。

button_inside_bar_button_item

如您所见,条形按钮项中有一个按钮。将动作连接到此按钮,动作将被触发。

答案 2 :(得分:0)

确保将相机按钮与touchUpInside事件

的操作相关联