2017-07-01 66 views
2

我試圖創建一個UIBarButtonItem,一旦按鈕被點擊後打開相機。出於某種原因,我的takePicture(_sender :)函數似乎沒有被調用。UIBarButtonItem不觸發IBAction

我最初嘗試使用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)。這工作完美。這告訴我,問題不在於函數本身,而是與連接有關。

回答

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。似乎有點怪......

0

確保您用行動連接相機按鈕touchUpInside事件

+0

如果我嘗試連接的動作一個UIButton,這將是建議的一個有價值的一塊。但是,UIBarButtonItem沒有touchUpInside事件。 UIBarButtonItem是UIBarItem的子類,它是NSObject的子類。而UIButton是UIControl的一個子類,它包含所有的touchUpInside()動作。 可能要更仔細地檢查文檔: - https://developer.apple.com/documentation/uikit/uicontrolevents - https://developer.apple.com/documentation/uikit/uibaritem - HTTPS: //developer.apple.com/documentation/uikit/uibarbuttonitem – Mattkx4